SpringBoot整合Shiro

shiro是什么?

  • 官网:http://shiro.apache.org/
  • Shiro 就是用来解决安全管理的系统化框架。
  • 它是一款主流的 Java 安全框架,不依赖任何容器,可以运行在 Java SE 和 Java EE 项目中,它的主要作用是对访问系统的用户进行身份认证、授权、会话管理、加密等操作。

Shiro 核心组件

  • 用户、角色、权限
  • 给用户赋予角色,会给角色赋予权限。
  1. UsernamePasswordToken: 用来封装用户登录信息,使用用户的登录信息来创建令牌 Token。
  2. SecurityManager:核心部分,负责安全认证和授权。
  3. Suject: Shiro 的一个抽象概念,包含了用户信息。
  4. Realm: 开发者自定义的模块,根据项目的需求,验证和授权的逻辑全部写在 Realm 中。
  5. AuthenticationInfo:用户的角色信息集合,认证时使用
  6. AuthorzationInfo:角色的权限信息集合,授权时使用
  7. DefaultWebSecurityManager: 安全管理器,开发者自定义的 Realm 需要注入到 DefaultWebSecurityManager 进行管理才能生效。
  8. ShiroFilterFactoryBean:过滤器工厂,Shiro 的基本运行机制是开发者定制规则,Shiro 去执行,具体的执行操作就是由 ShiroFilterFactoryBean 创建的一个个 Filter 对象来完成。
  9. shiro工作流程
    在这里插入图片描述

整合步骤

  1. 导入依赖
<!--shiro-->
<dependency>
	<groupId>org.apache.shiro</groupId>
	<artifactId>shiro-spring</artifactId>
	<version>1.4.2</version>
</dependency>
  1. 自定义Realm过滤器,继承自AuthorizingRealm
public class AccoutRealm extends AuthorizingRealm {

    @Autowired
    private AccountService accountService;

   //做认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        //客户端传过来的对象和密码,自动封装在token中,
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        //根据用户名进行查询,并且判断
        Account account = accountService.findByUsername(token.getUsername());
        if (account != null){
            //用户名不为空,继续验证密码
            return new SimpleAuthenticationInfo(account,account.getPassword(),getName());
        }
        //用户名为空,直接跳出验证
        return null;
    }
    
      //再授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        //获取当前用户邓登陆的信息
        Subject subject = SecurityUtils.getSubject();
        Account account = (Account) subject.getPrincipal();

        //设置角色
        Set<String> roles = new HashSet<>();
        roles.add(account.getRole());
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);

        //设置权限
        info.addStringPermission(account.getPerms());
        return info;
    }
}
  1. 配置视图解析器
 thymeleaf:
   prefix: classpath:/templates/shiro/
   suffix: .html
  1. 编写ShiroConfig配置类
@Configuration
public class ShiroConfig {

    //注入realm
    @Bean
    public AccountRealm accountRealm(){
        return new AccountRealm();
    }

    //注入安全管理器
    @Bean
    public DefaultWebSecurityManager securityManager(@Qualifier("accountRealm") AccountRealm accountRealm){
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        manager.setRealm(accountRealm);
        return manager;
    }

    //注入工厂
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        factoryBean.setSecurityManager(securityManager);
        
        //权限设置,根据自己需要设置相应的权限组
        Map<String,String> map = new Hashtable<>();
        map.put("/main","authc");
        map.put("/manage","perms[manage]");
        map.put("/administrator","roles[administrator]");
        factoryBean.setFilterChainDefinitionMap(map);
        
        //设置登陆页面
        factoryBean.setLoginUrl("/login");
        return factoryBean;
        
        //设置未授权页面
        factoryBean.setUnauthorizedUrl("/unauth");
    }
}
  1. 编写认证和授权规则,shiro帮我们写好了,我们只需要选择就可以。
  2. 如果不想使用shiro,直接将ShiroConfig上的@Configuration注释就可以了

认证过滤器

  • anon:无需认证。
  • authc:必须认证。
  • authcBasic:需要通过 HTTPBasic 认证。
  • user:不一定通过认证,只要曾经被 Shiro 记录即可,比如:记住我。

授权过滤器

  • perms:必须拥有某个权限才能访问。
  • role:必须拥有某个角色才能访问。
  • port:请求的端口必须是指定值才可以。
  • rest:请求必须基于 RESTful,POST、PUT、GET、DELETE。
  • ssl:必须是安全的 URL 请求,协议 HTTPS。

thymeleaf整合shiro

  1. 导入依赖
<dependency>
	<groupId>com.github.theborakompanioni</groupId>
	<artifactId>thymeleaf-extras-shiro</artifactId>
	<version>2.0.0</version>
</dependency>
  1. shiro'Config中配置thymeleaf方言
//shiro整合thymeleaf,引进方言
    @Bean
    public ShiroDialect shiroDialect(){
        return new ShiroDialect();
    }
  1. html代码中引入命名空间,就可以使用shiro的标签了
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.thymeleaf.org/thymeleaf-extras-shiro">
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值