【权限管理框架】一文看懂Shiro权限管理框架!3

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【权限管理框架】一文看懂Shiro权限管理框架!

8.权限控制性能提升

8.1.自定义Shiro Filter过滤器

(1)shiro默认的roles过滤器存在的问题

a92d8456d1654085800688268b9504d5.jpg

(2)自定义过滤器类,继承AuthorizationFilter

public class CustomRolesAuthorizationFilter extends AuthorizationFilter {
    @Override
    public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {
        Subject subject = getSubject(request, response);
        String[] rolesArray = (String[]) mappedValue;
        if (rolesArray == null || rolesArray.length == 0) {
            //no roles specified, so nothing to check - allow access.
            return true;
        }
        Set<String> roles = CollectionUtils.asSet(rolesArray);
        //filterChainDefinitionMap.put("/admin/**","roles[admin,root]")
        //  shiro配置角色默认是与的关系,需要都满足,这里改成或的关系,只要有其中一个即可
        for (String role : roles) {
            if (subject.hasRole(role)){
                return true;
            }
        }
        return false;
    }
}

(3)ShiroConfig中配置自定义过滤器

//设置自定义过滤器
Map<String, Filter> filterMap = new HashMap<>();
filterMap.put("customRolesFilter",new CustomRolesAuthorizationFilter());
shiroFilterFactoryBean.setFilters(filterMap);


47847b0b8e0048fa8b52d68226908368.jpg

8.2.Redis整合CacheManager

  • Redis整合CacheManager为了提高性能,避免每次都去库查

(1)加入shiro-redis依赖(shiro和redis整合的jar包)

<!--shiro整合redis-->
<dependency>
   <groupId>org.crazycake</groupId>
   <artifactId>shiro-redis</artifactId>
   <version>3.1.0</version>
</dependency>

(2)ShiroConfig中配置,RedisManager,RedisCacheManager,SecruityManager

    /**
     * 加入RedisManager
     */
    public RedisManager getRedisManager(){
        RedisManager redisManager = new RedisManager();
        redisManager.setHost("192.168.10.88");
        redisManager.setPort(6379);
        return redisManager;
    }
    /**
     * 配置RedisCacheManager
     */
    public RedisCacheManager cacheManager(){
        RedisCacheManager redisCacheManager = new RedisCacheManager();
        redisCacheManager.setRedisManager(getRedisManager());
        //设置过期时间,单位秒
        redisCacheManager.setExpire(60);
        return redisCacheManager;
    }

(3)改造现有逻辑自定义的Realm

doGetAuthorizationInfo 方法
原有:
  String username = (String)principals.getPrimaryPrincipal();
  User user = userService.findAllUserInfoByUsername(username);
改为
  User newUser = (User)principals.getPrimaryPrincipal();
    User user = userService.findAllUserInfoByUsername(newUser.getUsername());
doGetAuthenticationInfo方法
原有:
return new SimpleAuthenticationInfo(username, user.getPassword(), this.getClass().getName());
改为
return new SimpleAuthenticationInfo(user, user.getPassword(), this.getClass().getName());

8.3.Redis整合SessionManager

(1)加入SessionDAO的配置

    /**
     * 配置SessionDAO
     */
    public RedisSessionDAO sessionDAO(){
        RedisSessionDAO sessionDAO = new RedisSessionDAO();
        //设置RedisManager
        sessionDAO.setRedisManager(getRedisManager());
        return sessionDAO;
    }

(2)自定义的sessionManager中设置sessionDAO

//设置Session持久化,RedisSessionManager
//注意:如果不设置过期时间,redis中存储也和shiro中session的默认过期时间保持一致
customSessionManager.setSessionDAO(sessionDAO());

243a320dc5eb49e4b4b184aa6a877dfd.jpg

(3)注意传输的实体类都要实现Serializable接口,否则会报错

3c40fd45c5c44b359e2b8c0830f97788.jpg

8.4.ShiroConfig常用的Bean配置

(1)LifecycleBeanPostProcessor:管理shiro一些bean的生命周期,即bean初始化与销毁

@Bean
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
  return new LifecycleBeanPostProcessor();
}

(2)AuthorizationAttributeSourceAdvisor:加入注解的使用,不加入这个AOP注解不生效(@RequiresGuest)

@Bean
 public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() {
  AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager());
        return authorizationAttributeSourceAdvisor;
}

(3)DefaultAdvisorAutoProxyCreator:用来扫描上下文寻找的所有Advistor(通知器),将符合条件的Advisor应用到切入点的Bean中,需要在LifecycleBeanPostProcessor创建后才可以创建

@Bean
@DependsOn("lifecycleBeanPostProcessor")
public  DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator(){
        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator=new DefaultAdvisorAutoProxyCreator();
        defaultAdvisorAutoProxyCreator.setUsePrefix(true);
        return defaultAdvisorAutoProxyCreator;
}

9.分布式应用鉴权方式

9.1.自定义SessionId

  • Shiro 默认的sessionid生成 类名 SessionIdGenerator
  • 创建CustomSessionIdGenerator类,实现 SessionIdGenerator 接口的方法
/**  
  * 自定义session持久化  
  * @return  
  */  
public RedisSessionDAO redisSessionDAO(){  
    RedisSessionDAO redisSessionDAO = new RedisSessionDAO();           
    redisSessionDAO.setRedisManager(getRedisManager());   //设置sessionid生成器  
    redisSessionDAO.setSessionIdGenerator(new CustomSessionIdGenerator()); //设置自定义的sessionIdGenerator  
    return redisSessionDAO;  
}


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
存储 安全 数据库
管理端开发如何快速理解并实现权限控制总结
管理端开发如何快速理解并实现权限控制总结
|
存储 缓存 安全
权限管理与Shiro入门-2
权限管理与Shiro入门-2
79 2
|
存储 前端开发 安全
权限管理与Shiro入门-1
权限管理与Shiro入门-1
174 1
|
缓存 安全 Java
【权限管理框架】一文看懂Shiro权限管理框架!1
【权限管理框架】一文看懂Shiro权限管理框架!
|
存储 缓存 算法
【权限管理框架】一文看懂Shiro权限管理框架!2
【权限管理框架】一文看懂Shiro权限管理框架!
|
存储 数据库 数据安全/隐私保护
Shiro角色和权限管理
Shiro角色和权限管理
|
开发框架 前端开发 安全
基于MVC框架实现权限控制简介
基于MVC框架实现权限控制简介
213 0
基于MVC框架实现权限控制简介
|
安全 NoSQL Java
权限管理-整合 SpringSecurity(2) | 学习笔记
快速学习 权限管理-整合 SpringSecurity(2)
111 0
权限管理-整合 SpringSecurity(2) | 学习笔记
|
前端开发 API Nacos
权限管理-前端整合 | 学习笔记
快速学习 权限管理-前端整合
权限管理-前端整合 | 学习笔记
|
存储 开发框架 缓存
权限管理-SpringSecurity 介绍 | 学习笔记
快速学习 权限管理-SpringSecurity 介绍
111 0