


来看具体例子中shiro的应用:
首先 三个核心组件
- Subject 当前和软件交互的任何事件
- SecurityManager 管理所有Subject,SecurityManager 是 Shiro 架构的核心,配合内部安全组件共同组成安全伞
- Realms:用于进行权限信息的验证,我们自己实现。Realm 本质上是一个特定的安全 DAO:它封装与数据源连接的细节,得到Shiro 所需的相关的数据 在配置 Shiro 的时候,你必须指定至少一个Realm 来实现认证(authentication)和/或授权(authorization)
下面一个例子
用mybatis数据库储存用户信息 然后通过shiro
可以认证授权 对应用户对应显示跳转页面
| 首页面: |
| <!DOCTYPE html> |
| 这里的用的语法就是thymeleaf 和shiro结合thymeleaf |
| <html lang="en" xmlns:th="http://www.thymeleaf.org" |
| xmlns:shiro="http://www.thymeleaf.org/thymeleaf-extras-shiro"> |
| <head> |
| <meta charset="UTF-8"> |
| <title>Title</title> |
| </head> |
| <body> |
| 这个用来没登陆就显示登录 登录了就不显示 通过 session储存的 |
| <h2 th:if="${session.success==null}"> |
| <a th:href="@{/user/login}">登录</a> |
| </h2> |
| 是否拥有权限 此处的user:add 对应的就是数据表中的perms |
| 拥有参数访问权限 |
| <div shiro:hasPermission="user:add"> |
| <a th:href="@{/user/add}">add</a> |
| </div> |
| <br> |
| <div shiro:hasPermission="user:update"> |
| <a th:href="@{/user/update}">update</a> |
| </div> |
| <br> |
| <div shiro:hasPermission="user:delete"> |
| <a th:href="@{/user/delete}">delete</a> |
| </div> |
| </body> |
| </html> |
| 跳转的登陆页面 |
| <!DOCTYPE html> |
| <html lang="en" xmlns:th="http://www.thymeleaf.org"> |
| <head> |
| <meta charset="UTF-8"> |
| <title>Title</title> |
| </head> |
| <body> |
| 显示个信息是否登录了 |
| <p th:text="${msg}" style="color: rebeccapurple"></p> |
| form表单提交信息 |
| <form th:action="@{/subject}"> |
| 用户名:<input name="username"><br> |
| 密码:<input name="pwd"><br> |
| <input type="submit" placeholder="提交"> |
| </form> |
| </body> |
| </html> |
| controller层中接受form表单提交信息 |
| @RequestMapping("/subject") |
| public String subject(String username, String pwd, Model model) { |
| |
| |
| Subject subject = SecurityUtils.getSubject(); |
| |
| UsernamePasswordToken token = new UsernamePasswordToken(username, pwd); |
| try { |
| subject.login(token); |
| return "user/First"; |
| } catch (UnknownAccountException e) { |
| |
| model.addAttribute("msg", "用户名错误"); |
| return "user/login"; |
| } catch (IncorrectCredentialsException e) { |
| |
| model.addAttribute("msg", "密码错误"); |
| return "user/login"; |
| |
| } |
| springmvc config配置 |
| 此处就是配置了个过滤器 |
| @Configuration |
| public class ShiroConfig { |
| |
| |
| @Bean |
| public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager) { |
| ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); |
| shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager); |
| |
| |
| |
| |
| |
| |
| |
| Map<String, String> filterLinkedHashMap = new LinkedHashMap<>(); |
| filterLinkedHashMap.put("/user/delete", "perms[user:delete]"); |
| |
| filterLinkedHashMap.put("/user/add", "perms[user:add]"); |
| filterLinkedHashMap.put("/user/update", "perms[user:update]"); |
| filterLinkedHashMap.put("/user/*", "authc"); |
| |
| |
| shiroFilterFactoryBean.setUnauthorizedUrl("/Noauth"); |
| |
| shiroFilterFactoryBean.setLoginUrl("/login"); |
| return shiroFilterFactoryBean; |
| } |
| 重点重点 |
| |
| @Bean |
| public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) { |
| DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager(); |
| |
| defaultWebSecurityManager.setRealm(userRealm); |
| return defaultWebSecurityManager; |
| } |
| |
| |
| @Bean |
| public UserRealm userRealm() { |
| return new UserRealm(); |
| } |
| |
| @Bean |
| |
| public ShiroDialect getShiroDialect(){ |
| return new ShiroDialect(); |
| } |
| } |
| |
| UserRealm: |
| |
| public class UserRealm extends AuthorizingRealm { |
| @Autowired |
| UserService userService; |
| |
| @Override |
| protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { |
| SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); |
| Subject subject = SecurityUtils.getSubject(); |
| User principal = (User) subject.getPrincipal(); |
| info.addStringPermission(principal.getPerms()); |
| |
| return info; |
| } |
| |
| |
| @Override |
| protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { |
| UsernamePasswordToken usernamePasswordToken= (UsernamePasswordToken) token; |
| |
| 这里就是调用了mapper中service层 |
| User user = userService.query(usernamePasswordToken.getUsername()); |
| if(user==null){ |
| return null; |
| } |
| |
| Subject successsor = SecurityUtils.getSubject(); |
| Session session = successsor.getSession(); |
| session.setAttribute("success",user); |
| |
| |
| |
| |
| |
| |
| |
| return new SimpleAuthenticationInfo(user,user.getPwd(),""); |
| } |
| } |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?