SpringBoot集成Shiro实现权限控制
Shiro简介
Apache Shiro是一个功能强大且易于使用的Java安全框架,用于执行身份验证,授权,加密和会话管理。使用Shiro易于理解的API,您可以快速轻松地保护任何应用程序-从最小的移动应用程序到最大的Web和企业应用程序。
SpringBoot常用的权限管理框架主要有Shiro和Spring Security,相对来讲,Shiro的使用要更加简单。本文主要介绍SpringBoot与Shiro的集成与初步使用。
pom.xml引入
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.5.1</version>
</dependency>
LoginController
@RestController
public class LoginController {
@RequestMapping(value = "/login", method = RequestMethod.POST)
public Results login(String username, String password){
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
//是否记住用户
//token.setRememberMe(true);
// 执行登录方法
// 无异常则判断为登录成功
try{
subject.login(token);
}catch (UnknownAccountException e){
return Results.failure(ResponseCode.NULL_USERNAME);
}catch (IncorrectCredentialsException e){
return Results.failure(ResponseCode.WRONG_PASSWORD);
}
return Results.success();
}
}
Shiro中Subject代指用户对象,subject.login(token)既用户登录操作,这个方法将执行对应的认证与授权逻辑,它可能抛出两个异常:UnknownAccountException与IncorrectCredentialsException,分别为用户不存在和密码错误,无异常则判断登录成功。在这里我用自己的Results类对结果进行了封装。
ShiroConfig
@Configuration
public class ShiroConfig {
//创建ShiroFilterFactoryBean
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//设置SecurityManager
shiroFilterFactoryBean.setSecurityManager(securityManager);
Map<String, String> filterMap = new LinkedHashMap<>();
//无需登录
filterMap.put("/login", "anon");
//需要登录
filterMap.put("/user/**", "authc");
//需要特定权限
filterMap.put("/druid/stat", "roles[druid]");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
//修改认证失败的跳转页面
shiroFilterFactoryBean.setLoginUrl("/401");
shiroFilterFactoryBean.setUnauthorizedUrl("/403");
return shiroFilterFactoryBean;
}
//创建DefaultWebSecurityManager
@Bean(name="securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//关联realm
securityManager.setRealm(userRealm);
return securityManager;
}
// 创建Realm
@Bean(name="userRealm")
public UserRealm getUserRealm(){
return new UserRealm();
}
}
Shiro通过ShiroFilterFactoryBean来实现对URL的权限过滤,ShiroFilterFactoryBean允许接收一个Map<String, String>用于设置过滤规则,该Map的键对应需要过滤的URL,可使用通配符。该Map的值对应过滤器,常用的过滤器有:
- anno:无需认证
- authc:需要认证
- user:使用RememberMe功能可以直接访问
- perms:该资源必须得到对应资源权限才可以访问
- roles:该资源必须得到对应角色权限才可以访问
我们通过传入自定义的Reaml来控制对不同用户的权限管理。
UserRealm
public class UserRealm extends AuthorizingRealm {
@Autowired
SysUserService sysUserService;
private SysUser user;
@Override
//执行授权逻辑
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//根据用户身份授权
if(user.getUsername().equals("zzZ")){
info.addRole("druid");
// info.addRoles(Permissions.adminPerms);
}
// 添加身份权限
//info.addRole("structure:query");
return info;
}
@Override
//执行认证逻辑
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token1) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken)token1;
//查询数据库验证用户身份
String currentUsername = token.getUsername();
user = sysUserService.getSimpleUserByName(currentUsername);
// 用户不存在
if(user==null){return null; }
String password = user.getPassword();
return new SimpleAuthenticationInfo(user, password, "");
}
}
编写一个自定义的UserRealm类用于执行认证与授权逻辑,这个类继承自AuthorizingRealm,重写了两个方法:
- doGetAuthorizationInfo: 用于执行授权逻辑
- doGetAuthenticationInfo: 用于执行认证逻辑,通常通过查询数据库实现。
获取当前用户
SysUser user = (SysUser) SecurityUtils.getSubject().getPrincipal();
通过SecurityUtils.getSubject()方法可以获取当前用户,在Service或Controller层中可以通过当前用户身份信息实现相关逻辑。
SpringBoot集成Shiro实现权限控制的更多相关文章
- springboot集成shiro 实现权限控制(转)
shiro apache shiro 是一个轻量级的身份验证与授权框架,与spring security 相比较,简单易用,灵活性高,springboot本身是提供了对security的支持,毕竟是自 ...
- springboot集成shiro实现权限认证
github:https://github.com/peterowang/shiro 基于上一篇:springboot集成shiro实现身份认证 1.加入UserController package ...
- SpringBoot整合Shiro实现权限控制,验证码
本文介绍 SpringBoot 整合 shiro,相对于 Spring Security 而言,shiro 更加简单,没有那么复杂. 目前我的需求是一个博客系统,有用户和管理员两种角色.一个用户可能有 ...
- SpringBoot整合Shiro实现权限控制
目录 1.SpringBoot整合Shiro 1.1.shiro简介 1.2.代码的具体实现 1.2.1.Maven的配置 1.2.2.整合需要实现的类 1.2.3.项目结构 1.2.4.ShiroC ...
- springboot集成shiro实现权限缓存和记住我
到这节为止,我们已经实现了身份验证和权限验证.但是,如果我们登录之后多次访问http://localhost:8080/userInfo/userDel的话,会发现权限验证会每次都执行一次.这是有问题 ...
- SpringBoot集成Shiro 实现动态加载权限
一.前言 本文小编将基于 SpringBoot 集成 Shiro 实现动态uri权限,由前端vue在页面配置uri,Java后端动态刷新权限,不用重启项目,以及在页面分配给用户 角色 . 按钮 .ur ...
- SpringBoot集成Shiro并用MongoDB做Session存储
之前项目鉴权一直使用的Shiro,那是在Spring MVC里面使用的比较多,而且都是用XML来配置,用Shiro来做权限控制相对比较简单而且成熟,而且我一直都把Shiro的session放在mong ...
- SpringBoot学习笔记(五):SpringBoot集成lombok工具、SpringBoot集成Shiro安全框架
SpringBoot集成lombok工具 什么是lombok? 自动生成setget方法,构造函数,打印日志 官网:http://projectlombok.org/features/index. 平 ...
- SpringBoot与Shiro整合权限管理实战
SpringBoot与Shiro整合权限管理实战 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] *观看本文章需要有一定SpringBoot整合经验* Shiro框架简介 Apach ...
随机推荐
- 关于js中iframe 中 location.href的用法
关于js中"window.location.href"."location.href"."parent.location.href".&qu ...
- Ubuntu 18.04 将gcc版本降级为5.5版本
Remark: Polynomial algebra 程序由于版本问题只能在gcc 5.0 版本运行, 而ubuntu更新会将gcc 更新到7.0版本,出现冲突(报错:如下) collect2: er ...
- OpenCV-Python 如何使用背景分离方法 | 四十六
目标 背景分离(BS)是一种通过使用静态相机来生成前景掩码(即包含属于场景中的移动对象像素的二进制图像)的常用技术. 顾名思义,BS计算前景掩码,在当前帧与背景模型之间执行减法运算,其中包含场景的静态 ...
- 大O 表示法
大O表示法 指出了算法有多快.例如,假设列表包含n个元素.简单查找需要检查每个元素,因此需要执行n次操作.使用大O表示法,这个运行时间为O(n).单位秒呢?没有——大O表示法指的并非以秒为单位的速度. ...
- 7.Maven命令
在eclipse中运行maven 一.首先要对pom.xml文件右键→Run As→Maven build 二.输入Maven命令 三.常见的Maven命令有: [1]clean 清理 [2]comp ...
- 一文搞懂 ThreadLocal 原理
当多线程访问共享可变数据时,涉及到线程间同步的问题,并不是所有时候,都要用到共享数据,所以就需要线程封闭出场了. 数据都被封闭在各自的线程之中,就不需要同步,这种通过将数据封闭在线程中而避免使用同步的 ...
- Linux下使用FastDFS
本文所有操作均在CentOS 7.x环境下进行. 1.1.单节点FastDFS 整个安装过程非常复杂,很容易出错,建议进行多次备份. 我们这里不打算安装多台虚拟机,因此会把tracker和storag ...
- 3.Metasploit攻击流程及命令介绍
Metasploit 进阶第一讲 攻击流程及命令介绍 01.渗透测试过程环节(PTES) 1.前期交互阶段:与客户组织进行交互讨论,确定范围,目标等 2.情报搜集阶段:获取更多目标组织信 ...
- A 【NOIP2012 day2】疫情控制
时间限制 : 20000 MS 空间限制 : 128000 KB 评测说明 : 2s,128m 问题描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是 ...
- Spring之Bean的管理方式(Content,Beans)
Spring的bean管理(注释) 注解 代码里特殊的标记,使用注解也可以直接完成相关功能 注解写法:@注解名称(属性名=属性值) 使用在类,方法,属性上面 Spring注解开发准备 导入jar包 ( ...