shiro学习笔记:授权管理
shiro授权管理,通过realm进行授权,shiro框架通过realm与数据库连接,因此登录,授权,角色获取等与数据库有关的都在数据库中获得;
授权就是给某个用户授予某个权限,当用户访问某一资源时,发送请求,判断当前用户有没有对当前资源的访问权限,如果有就放行,如果没有,报异常:
public class MyRealm extends AuthorizingRealm { @Autowired private UserMapper userMapper; /*授权方法*/ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 获取用户名 String username = principals.getPrimaryPrincipal().toString(); // 模拟从数据库中获取到的权限,拥有add与list权限 Set<String> permissions = new HashSet<>(); permissions.add("emp:add"); permissions.add("emp:list"); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.setStringPermissions(permissions); return info; } /*认证方法,在之前继承的方法只需要重写认证方法,现在加入了权限,可以继承AuthorizingRealm类,将认证预授权写在一个方法里*/ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token; String username = usernamePasswordToken.getUsername(); // 从数据库获取密码 String truePassword = userMapper.getPasswordByUsername(username); ByteSource salt = ByteSource.Util.bytes(username); SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, truePassword,salt,this.getName()); return info; } }
controller中为方法分配权限,规定方法访问需要具备的权限
package com.zs.controller; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.List; @Controller @RequestMapping("/emp") @ResponseBody public class EmpController { /** * 为请求添加权限,什么样的权限可以访问该资源 * @RequiresPermissions("emp:add"):为当前方法添加emp:add权限,只有拥有emp:add权限才能访问该方法 * @return */ @RequestMapping("/add") @RequiresPermissions("emp:add") public String test1() { return "ok"; } /** * 在realm的授权方法中,为给用户授权emp:update,因此无法访问本路径资源 * @return */ @RequestMapping("/update") @RequiresPermissions("emp:update") public String test2() { return "ok"; } @RequestMapping("/list") @RequiresPermissions("emp:list") public String test3() { return "list"; } }
注意:这里使用注解@RequiresPermissions,在shiro中配置启用注解:
还要再mvc配置文件中配置添加启用aop注解方式:
再浏览器发送请求测试;
除了这种方式,还可以使用shiro的jsp标签来进行验证:
需要先导入标签库:
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<%--如果没有登录显示登录连接,如果登录了,显示用户名--%> <shiro:authenticated> <shiro:principal/> </shiro:authenticated> <shiro:notAuthenticated> <a href="/view/login.jsp">登录</a> </shiro:notAuthenticated>
分类:
shiro
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义