前言
大家好,一直以来我都本着用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 基础知识 的铺垫。目前正在出一个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
中如何进行缓存,缓存对于业务来讲还是比较重要的,尤其对于量大的情况下。欢迎加群一起学习交流 ~