SpringBoot进阶之整合Shiro鉴权框架(四)
前言
大家好,一直以来我都本着用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 「基础知识」 的铺垫。目前正在出一个SpringBoot长期系列教程,从入门到进阶, 篇幅会较多~
适合人群
- 学完Java基础
- 想通过Java快速构建web应用程序
- 想学习或了解SpringBoot
- SpringBoot进阶学习
「大佬可以绕过 ~」
背景
如果你是一路看过来的,很高兴你能够耐心看完。之前带大家学了Springboot基础部分,对基本的使用有了初步的认识, 接下来的几期内容将会带大家进阶使用,会先讲解基础中间件的使用和一些场景的应用,或许这些技术你听说过,没看过也没关系,我会带大家一步一步的入门,耐心看完你一定会有收获~
情景回顾
上期带大家学习了Shiro中如何记录用户状态,本期将带大家学习Shiro中如何进行权限认证。同样的,我们集成到Springboot中。
doGetAuthenticationInfo()
还记得之前带大家实现的doGetAuthenticationInfo()方法实现的用户认证吗,其实还有一个,我们可以用它实现权限控制,这里我们基于RBAC基于用户角色来控制权限, 之前有一个方法没实现,我们现在实现一下:
/**
* 获取用户角色和权限
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) {
User user = (User) SecurityUtils.getSubject().getPrincipal();
String userName = user.getUsername();
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
// 获取用户角色
Set<String> roleSet = new HashSet<>();
String role = UserMock.getRole(userName);
roleSet.add(role);
simpleAuthorizationInfo.setRoles(roleSet);
// 获取用户权限
String permission = UserMock.getPermission(userName);
Set<String> permissionSet = new HashSet<String>();
permissionSet.add(permission);
simpleAuthorizationInfo.setStringPermissions(permissionSet);
return simpleAuthorizationInfo;
}
开启权限注解
在Shiro中,为我们提供了一列好用的注解,我们一起看一下:
// 表示Subject已经通过login身份验证
@RequiresAuthentication
// 表示当前是用户身份
@RequiresUser
// 表示当是游客身份。
@RequiresGuest
// 表示当前需要的角色
@RequiresRoles(value={"admin", "user"}, logical= Logical.AND)
// 表示当前需要的权限
@RequiresPermissions (value={"p:admin", "p:user"}, logical= Logical.OR)
使用它之前,我们需要开启它的注解,怎么做呢?在ShiroConfig中加入:
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
下面直接使用就可以了:
@RestController
public class IndexController {
@RequiresPermissions("p:user")
@RequestMapping("/index")
public String index(Model model) {
// 登录成后,即可通过Subject获取登录的用户信息
User user = (User) SecurityUtils.getSubject().getPrincipal();
model.addAttribute("user", user);
return "index --->" + user.getUsername();
}
}
这样就可以了, 很简单,大家可以自己运行一下。还有一个疑问?用户没有权限,我想自定义返回错误信息怎么办呢?很简单,我们一起看一下
权限异常捕获
还记得之前教大家的全局已经捕获吗?没错我们只要在那里加上要捕获的异常类就好了,实际上它是抛出了AuthorizationException的异常
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler(value = AuthorizationException.class)
public String handleAuthorizationException() {
return "您当前没有权限访问~ 请联系管理员";
}
}
这样就可以了~
结束语
本期内容就到这里结束了,总结一下,本节主要讲了Shiro如何进行权限认证以及常用的权限注解,大家可以自己多试试
下期预告
下期给大家讲讲Shiro中如何进行缓存,缓存对于业务来讲还是比较重要的,尤其对于量大的情况下。欢迎加群一起学习交流 ~
往期内容
- 我的博客(阅读体验较佳)
- Springboot入门
- Springboot基础(一)
- Springboot基础(二)
- Springboot基础(三)
- Springboot基础(四)
- Springboot基础(五)
- SpringBoot进阶之缓存中间件Redis
- SpringBoot进阶之MyBatis分页插件
- SpringBoot进阶之跨域问题处理(CORS)
- SpringBoot进阶之日志集成
- SpringBoot进阶之请求拦截
- SpringBoot进阶之事务管理及并发问题
- SpringBoot进阶之整合Shiro鉴权框架(一)
- SpringBoot进阶之整合Shiro鉴权框架(二)
- SpringBoot进阶之整合Shiro鉴权框架(三)
项目源码(源码已更新 欢迎star??)
- springboot-all
- 地址: https://github.com/qiuChengleiy/springboot-all.git