SpringBoot整合Shiro 四:认证+授权

Posted LonZyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot整合Shiro 四:认证+授权相关的知识,希望对你有一定的参考价值。

搭建环境见: SpringBoot整合Shiro 一:搭建环境

shiro配置类见: SpringBoot整合Shiro 二:Shiro配置类

shiro整合Mybatis见:SpringBoot整合Shiro 三:整合Mybatis

 

认证

未授权时

ShiroConfig中添加授权访问

  如果用户没有拥有 user:add 就无法访问add页面

    filterMap.put("/user/add","perms[user:add]");

  如果用户没有拥有 user:update 就无法访问 update 页面

    filterMap.put("/user/update","perms[user:update]");

  跳转到一个未授权的页面

    bean.setUnauthorizedUrl("/noauth");

@Bean(name = "shiroFilterFactoryBean")
 public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager")DefaultWebSecurityManager defaultWebSecurityManager){
     ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
     bean.setSecurityManager(defaultWebSecurityManager);
 ​
     Map<String ,String> filterMap = new LinkedHashMap<>();
 ​
     //授权
     filterMap.put("/user/add","perms[user:add]");
     filterMap.put("/user/update","perms[user:update]");
 ​
     filterMap.put("/user/*","authc");
 ​
     bean.setFilterChainDefinitionMap(filterMap);
 ​
     //未授权页面
     bean.setUnauthorizedUrl("/noauth");
 ​
     bean.setLoginUrl("/toLogin");
 ​
     return bean;
 }

 

Controller中添加未授权页面

  使用 @ResponseBody 直接显示字符串

@RequestMapping("/noauth")
 @ResponseBody
 public String unauthorized(){
     return "未授权无法访问";
 }

 

测试未授权的访问

  登录root用户,开始访问2个页面

  add

  update

 

 

授权

数据库添加权限字段

 

添加 perms(varchar)

 

对应实体类pojo
 使用了Lombok
package com.zy.pojo;
 ​
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 ​
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
 public class User {
     private int id;
     private String name;
     private String pwd;
     
     private String perms;
 ​
 }

 

授权操作

UserRealm 中 AuthorizationInfo(授权)

  授权的对象 SimpleAuthorizationInfo

   SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

  添加权限的方法 addStringPermission

   info.addStringPermission("user:add");

  拿到当前登录的对象(认证成功之后,可以获取到)

    Subject subject = SecurityUtils.getSubject();

  获取到User

    User currentUser = (User) subject.getPrincipal();

  设置当前用户的权限

    info.addStringPermission(currentUser.getPerms());

 //授权

 @Override
 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
     System.out.println("执行了=>授权doGetAuthorizationInfo");
 ​
     SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
     info.addStringPermission("user:add");
 ​
     //拿到当前登录的对象
     Subject subject = SecurityUtils.getSubject();
     //获取到User
     User currentUser = (User) subject.getPrincipal();
     //设置当前用户的权限
     info.addStringPermission(currentUser.getPerms());
 ​
     return info;
 }

 

测试

root(初始没有权限)

  可以访问add页面了,因为被授权了

  update仍然不行,因为没有权限

 

张三(本身有add权限)

  可以访问add页面

  update不行

 

王五(本身有update)

  add

  update

 都可以访问了

 

 

以上是关于SpringBoot整合Shiro 四:认证+授权的主要内容,如果未能解决你的问题,请参考以下文章

Shiro安全框架——快速入门登录拦截用户认证请求授权

shiro框架学习-2-springboot整合shiro及Shiro认证授权流程

springboot整合shiro的认证与授权流程

shiro学习(通俗易懂)

SpringBoot技术专题「权限校验专区」Shiro整合JWT授权和认证实现

SpringBoot技术专题「实战开发系列」带你一同探索Shiro整合JWT授权和认证实战开发