springboot②La integración más correcta de shiro y el uso de ehcache cache

https://blog.csdn.net/tanleijin/java/article/details/81118963

Cuando springboot integra shiro y ehcache, primero integre ehcache y luego integre shiro, de modo que pueda usarse directamente cuando shiro configure cacheManager. Estos son los pasos de integración correctos: El
primer paso es integrar ehcache:
1. Introduzca las siguientes dependencias en el archivo pom.xml


org.springframework.boot
spring-boot-starter-cache



net.sf.ehcache
ehcache

2. Introduzca la configuración archivo ehcache.xml

El contenido específico de ehcache.xml:

<? xml version = "1.0" encoding = "UTF-8"?>


<!-- 这里的 users 缓存空间是为了下面的 demo 做准备 -->
<cache
        name="users"
        eternal="false"
        maxElementsInMemory="100"
        overflowToDisk="false"
        diskPersistent="false"
        timeToIdleSeconds="0"
        timeToLiveSeconds="300"
        memoryStoreEvictionPolicy="LRU" />
Explicación detallada de la configuración del archivo ehcache.xml Parte de la información proviene de la red diskStore: la ruta de la caché, ehcache se divide en memoria y disco en dos niveles, este atributo define la ubicación de la caché del disco. defaultCache: La estrategia de caché predeterminada, cuando ehcache no puede encontrar el caché definido, se utiliza esta estrategia de caché. Solo se puede definir uno. name: nombre de la caché. maxElementsInMemory: el número máximo de cachés maxElementsOnDisk: el número máximo de cachés en el disco duro. eterno: si el objeto es válido de forma permanente, una vez establecido, el tiempo de espera no funcionará. overflowToDisk: si se debe guardar en el disco, cuando el sistema está inactivo timeToIdleSeconds: establece el tiempo de inactividad permitido (unidad: segundos) antes de que caduque el objeto. Solo se usa cuando el objeto eterno = falso no es válido permanentemente, un atributo opcional, el valor predeterminado es 0, es decir, el tiempo de inactividad es infinito. timeToLiveSeconds: establece el tiempo de supervivencia permitido (unidad: segundos) del objeto antes de que expire. El tiempo máximo es entre el tiempo de creación y el tiempo de vencimiento. Se usa solo cuando el objeto eterno = falso no es válido permanentemente, el valor predeterminado es 0. Es decir, la vida útil del objeto es infinita. diskPersistent: si almacenar datos en caché durante el período de reinicio de la máquina virtual. Si el almacenamiento en disco persiste entre reinicios de la máquina virtual. El valor predeterminado es falso. diskSpoolBufferSizeMB: este parámetro establece el tamaño del búfer de DiskStore (caché de disco). El valor predeterminado es 30 MB. Cada caché debe tener su propio búfer. diskExpiryThreadIntervalSeconds: el intervalo de ejecución de subprocesos de falla de disco, el valor predeterminado es 120 segundos. memoryStoreEvictionPolicy: cuando se alcanza el límite de maxElementsInMemory, Ehcache limpiará la memoria de acuerdo con la política especificada. La estrategia predeterminada es LRU (la menos utilizada recientemente). Puede configurarlo en FIFO (primero en entrar, primero en salir) o LFU (menos utilizado). clearOnFlush: si se borra cuando la cantidad de memoria es máxima. memoryStoreEvictionPolicy: Las políticas opcionales son: LRU (menos utilizada recientemente, política predeterminada), FIFO (primero en entrar, primero en salir), LFU (menor acceso). FIFO, primero en entrar, primero en salir, LFU, de uso menos frecuente, ha sido el menos utilizado. Como se mencionó anteriormente, el elemento almacenado en caché tiene un atributo de hit, y el que tenga el valor de hit más pequeño se borrará de la caché. LRU, menos usado recientemente, el menos usado recientemente. El elemento almacenado en caché tiene una marca de tiempo. Cuando la capacidad de la caché está llena y necesita hacer espacio para almacenar en caché nuevos elementos, la marca de tiempo en el elemento almacenado en caché existente es diferente de la hora actual. El elemento más lejano se borrará de la caché. 3. Agregue la anotación de inicio a la clase principal y agregue la anotación @EnableCaching para habilitar el almacenamiento en caché en la clase principal de Spring Boot. @EnableCaching @MapperScan (basePackages = "com.tan.dream. **. Dao") @SpringBootApplication clase pública DreamApplication { Las estrategias opcionales son: LRU (menos utilizado recientemente, estrategia predeterminada), FIFO (primero en entrar, primero en salir), LFU (menor acceso). FIFO, primero en entrar, primero en salir, LFU, de uso menos frecuente, ha sido el menos utilizado. Como se mencionó anteriormente, el elemento almacenado en caché tiene un atributo de hit, y el que tenga el valor de hit más pequeño se borrará de la caché. LRU, menos usado recientemente, el menos usado recientemente. El elemento almacenado en caché tiene una marca de tiempo. Cuando la capacidad de la caché está llena y necesita hacer espacio para almacenar en caché nuevos elementos, la marca de tiempo en el elemento almacenado en caché existente es diferente de la hora actual. El elemento más lejano se borrará de la caché. 3. Agregue la anotación de inicio a la clase principal y agregue la anotación @EnableCaching para habilitar el almacenamiento en caché en la clase principal de Spring Boot. @EnableCaching @MapperScan (basePackages = "com.tan.dream. **. Dao") @SpringBootApplication clase pública DreamApplication { Las estrategias opcionales son: LRU (menos utilizado recientemente, estrategia predeterminada), FIFO (primero en entrar, primero en salir), LFU (menor acceso). FIFO, primero en entrar, primero en salir, LFU, de uso menos frecuente, ha sido el menos utilizado. Como se mencionó anteriormente, el elemento almacenado en caché tiene un atributo de hit, y el que tenga el valor de hit más pequeño se borrará de la caché. LRU, menos usado recientemente, el menos usado recientemente. El elemento almacenado en caché tiene una marca de tiempo. Cuando la capacidad de la caché está llena y necesita hacer espacio para almacenar en caché nuevos elementos, la marca de tiempo en el elemento almacenado en caché existente es diferente de la hora actual. El elemento más lejano se borrará de la caché. 3. Agregue la anotación de inicio a la clase principal y agregue la anotación @EnableCaching para habilitar el almacenamiento en caché en la clase principal de Spring Boot. @EnableCaching @MapperScan (basePackages = "com.tan.dream. **. Dao") @SpringBootApplication clase pública DreamApplication {
public static void main(String[] args) {
	SpringApplication.run(DreamApplication.class, args);
}

} 4.
Se pueden usar las anotaciones de almacenamiento en caché @Cacheable y @CachePut en springboot (el uso específico de las anotaciones de almacenamiento en caché debe completarse)

La atención se centra en el segundo paso para integrar shiro y usar la caché ehcache:
1. Introduzca las siguientes dependencias en el archivo pom.xml


org.apache.shiro
shiro-spring
1.3.2



org.apache.shiro
shiro-ehcache
1.3.2

2 . Escribe la verificación de Shiro Realm, por supuesto, este es mi reino shrio, algunas modificaciones deben realizarse de acuerdo con tu propio proyecto.
Clase pública UserRealm extiende AuthorizingRealm { / * @Autowired UserDao userMapper; @Autowired MenuService menuService; * /



/**
 * 授权
 * @param arg0
 * @return
 */
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {

	UserDO userDO = (UserDO)SecurityUtils.getSubject().getPrincipal();
	Long userId =  userDO.getUserId();
	MenuService menuService = ApplicationContextRegister.getBean(MenuService.class);
	Set<String> perms = menuService.listPerms(userId);
	SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
	info.setStringPermissions(perms);
	return info;
}

/**
 * 认证
 * @param token
 * @return
 * @throws AuthenticationException
 */
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
	String username = (String) token.getPrincipal();
	Map<String, Object> map = new HashMap<>(16);
	map.put("username", username);
	String password = new String((char[]) token.getCredentials());

	UserDao userMapper = ApplicationContextRegister.getBean(UserDao.class);
	// 查询用户信息
	UserDO user = userMapper.list(map).get(0);

	// 账号不存在
	if (user == null) {
		throw new UnknownAccountException("账号或密码不正确");
	}

	// 密码错误
	if (!password.equals(user.getPassword())) {
		throw new IncorrectCredentialsException("账号或密码不正确");
	}

	// 账号锁定
	if (user.getStatus() == 0) {
		throw new LockedAccountException("账号已被锁定,请联系管理员");
	}
	SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, password, getName());
	return info;
}

}
3. Agregue la clase de configuración shiro
@Configuration
public class ShiroConfig {

//@Autowired
//private CacheManager cacheManager;

@Value("${server.session-timeout}")
private int tomcatTimeout;

@Bean
public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
    return new LifecycleBeanPostProcessor();
}

/**
 * ShiroDialect,为了在thymeleaf里使用shiro的标签的bean
 * @return
 */

/ * @Bean
public ShiroDialect shiroDialect () { return new ShiroDialect (); } * /

@Bean
ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
	ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
	shiroFilterFactoryBean.setSecurityManager(securityManager);
	shiroFilterFactoryBean.setLoginUrl("/login");
	shiroFilterFactoryBean.setSuccessUrl("/index");

	shiroFilterFactoryBean.setUnauthorizedUrl("/403");
	LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
	filterChainDefinitionMap.put("/css/**", "anon");
	filterChainDefinitionMap.put("/js/**", "anon");
	filterChainDefinitionMap.put("/fonts/**", "anon");
	filterChainDefinitionMap.put("/img/**", "anon");
	filterChainDefinitionMap.put("/docs/**", "anon");
	filterChainDefinitionMap.put("/druid/**", "anon");
	filterChainDefinitionMap.put("/upload/**", "anon");
	filterChainDefinitionMap.put("/files/**", "anon");
	filterChainDefinitionMap.put("/logout", "logout");
	filterChainDefinitionMap.put("/", "anon");
	filterChainDefinitionMap.put("/blog", "anon");
	filterChainDefinitionMap.put("/blog/open/**", "anon");
	//filterChainDefinitionMap.put("/**", "authc");
    filterChainDefinitionMap.put("/**", "anon");

    shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
	return shiroFilterFactoryBean;
}


@Bean
public SecurityManager securityManager(EhCacheManager ehCacheManager){
    DefaultWebSecurityManager securityManager =  new DefaultWebSecurityManager();
    //设置realm.
    securityManager.setRealm(userRealm());
    // 自定义缓存实现 使用redis
    securityManager.setCacheManager(ehCacheManager);
    securityManager.setSessionManager(sessionManager());
    return securityManager;
}
@Bean
public EhCacheManager ehCacheManager(CacheManager cacheManager) {
    EhCacheManager em = new EhCacheManager();
    //将ehcacheManager转换成shiro包装后的ehcacheManager对象
    em.setCacheManager(cacheManager);
    //em.setCacheManagerConfigFile("classpath:ehcache.xml");
    return em;
}
/**
 * shiro session的管理
 */
@Bean
public DefaultWebSessionManager sessionManager() {
    DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
    sessionManager.setGlobalSessionTimeout(tomcatTimeout*1000);
    //设置sessionDao对session查询,在查询在线用户service中用到了
    sessionManager.setSessionDAO(sessionDAO());
    //配置session的监听
    Collection<SessionListener> listeners = new ArrayList<SessionListener>();
    listeners.add(new BDSessionListener());
    sessionManager.setSessionListeners(listeners);
    //设置在cookie中的sessionId名称
    sessionManager.setSessionIdCookie(simpleCookie());
    return sessionManager;
}

@Bean
public SessionDAO sessionDAO(){
    return new MemorySessionDAO();
}

@Bean
public SimpleCookie simpleCookie(){

    SimpleCookie simpleCookie = new SimpleCookie();
    simpleCookie.setName("jeesite.session.id");

    return simpleCookie;
}

@Bean
UserRealm userRealm() {
	UserRealm userRealm = new UserRealm();
	return userRealm;
}

/**
 *  开启shiro aop注解支持.
 *  使用代理方式;所以需要开启代码支持;
 * @param securityManager
 * @return
 */
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){
    AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
    authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
    return authorizationAttributeSourceAdvisor;
}

}
Entre ellos:
@Bean
public EhCacheManager ehCacheManager (CacheManager cacheManager) { EhCacheManager em = new EhCacheManager (); // Convierta ehcacheManager en un objeto ehcacheManager envuelto por shiro em.setCacheManager (cacheManager); //em.setCacheManagerConfigFilee("class .setCacheManagerConfigFilee("class. ”); Return em; } Esto es para configurar el administrador de caché de shiro org.apache.shiro.cache.ehcach.EhCacheManager. El parámetro del método anterior es inyectar el objeto cacheManager en el contenedor de primavera en EhCacheManager, para que pueda Shiro y las anotaciones en caché utilizan el mismo método de almacenamiento en caché. El mayor malentendido aquí es la siguiente configuración: @Bean public EhCacheManager ehCacheManager () { EhCacheManager cacheManager = new EhCacheManager (); cacheManager.setCacheManagerConfigFile ("classpath: config / ehcache.xml"); returncacheManager; }














Asegúrese de no configurarlo de esta manera, es solo que shiro integra el caché ehcache, no al contenedor de primavera para administrarlo.

Supongo que te gusta

Origin blog.csdn.net/qq_35577329/article/details/105602809
Recomendado
Clasificación