Shiro是什么?

Shiro是一款主流的Java安全框架,不依赖任何容器,可以运行在Java SE和Java EE项目中,它的主要作用是对访问系统的用户进行身份认证、授权、会话管理、加密等操作。

Shiro的核心组件

权限管理可以分为三大板块:用户、角色、权限

权限赋予给角色,用户再拥有角色

通过这种方式来为用户赋予权限

  1. UsernamePasswordToken:Shiro用来封装用户登录信息,使用用户的登录信息来创建令牌Token。
  2. SecurityManager:Shiro的核心部分,负责安全认证与授权。
  3. Subject:Shiro的一个抽象概念,包含了用户信息,表示“当前正在操作的用户”。
  4. Realm:开发者自定义的模块,根据项目的需求,验证和授权的逻辑全部写在Realm中。
  5. Authenticationinfo:用户的角色信息集合,认证时使用。
  6. Authorizationinfo:角色的权限信息集合,授权时使用。
  7. DefaultWebSecurityManager:安全管理器,开发者自定义的Realm需要注入到该组件进行管理才能生效。
  8. ShiroFilterFactoryBean:Shiro过滤器工厂,Shiro的基本运行机制是开发者定制规则,Shiro去执行,具体的执行就是由该组件创建的Filter对象来执行。

搭建集成Shiro的Spring Boot框架

  1. pom.xml中引入Shiro

    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.9.1</version>
    </dependency>
  2. 自定义Shiro过滤器

    在realm包中新建AccountRealm

    public class AccountRealm extends AuthorizingRealm {
    
        @Autowired
        private AccountService accountService;
    
        /**
         * 授权
         * @param principalCollection
         * @return
         */
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
            return null;
        }
    
        /**
         * 认证
         * @param authenticationToken
         * @return
         * @throws AuthenticationException
         */
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
            // 前端传过来的用户名密码封装到↓这个token里
            UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
            // 通过查询数据库中的account来比对前端传过来的数据,如果没有则直接返回null
            Account account = accountService.findByUsername(token.getUsername());
            // 如果不为null,则还需要验证密码
            if(account != null){
                // 直接返回一个↓这个对象,它会将account的密码跟token的密码进行比对,相同则通过,不同就抛异常
                return new SimpleAuthenticationInfo(account, account.getPwd(), getName());
            }
            // 如果返回null,shiro会自动抛出一个异常表示账户不存在
            return null;
        }
    }
  3. 新建配置类

    再config包中新建ShiroConfig配置类

    @Configuration
    public class ShiroConfig {
    
        @Bean
        public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
            ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
            factoryBean.setSecurityManager(defaultWebSecurityManager);
            return factoryBean;
        }
    
        @Bean
        public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("accountRealm") AccountRealm accountRealm){
            DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
            manager.setRealm(accountRealm);
            return manager;
        }
    
        @Bean
        public AccountRealm accountRealm(){
            return new AccountRealm();
        }
    
    
    }
    
  4. 编写认证和授权规则:

    • 认证过滤器:

      anon: 无需认证

      authc: 必须认证

      authcBasic: 需要通过HTTPBasic认证

      user: 不一定通过认证,只要曾经被Shiro记录即可

    • 授权过滤器:

      perms: 必须拥有某个权限才能访问

      role:必须拥有某个角色才能访问。

      port:请求的端口必须是指定值才可以

      rest:请求必须基于RESTful(POST、PUT、GET、DELETE)

      ssl:必须是安全的URL请求,遵循HTTPS协议

最后修改:2023 年 07 月 15 日
如果觉得我的文章对你有用,能不能v我50参加疯狂星期四