SpringBoot 集成 Shiro

SpringBoot 集成 Shiro

一、添加依赖

pom.xml

<!--shiro--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-web-starter</artifactId> <version>1.5.3</version> </dependency> <!--shiro整合thymeleaf--> <dependency> <groupId>com.github.theborakompanioni</groupId> <artifactId>thymeleaf-extras-shiro</artifactId> <version>2.0.0</version> </dependency>

二、添加配置文件

UserRealm.java

import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; public class UserRealm extends AuthorizingRealm { // 授权 @Override protected AuthorizationInfo doGetAuthorizationInfo (PrincipalCollection principalCollection) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.addStringPermission("user:add"); info.addStringPermission("user:del"); return info; } // 认证 @Override protected AuthenticationInfo doGetAuthenticationInfo (AuthenticationToken authenticationToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken)authenticationToken; if(!"admin".equals(token.getUsername())) { return null; } return new SimpleAuthenticationInfo("","admin",""); } }

ShiroConfig.java

import at.pollux.thymeleaf.shiro.dialect.ShiroDialect; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.LinkedHashMap; import java.util.Map; @Configuration public class ShiroConfig { private final String PERMS = "perms[0]"; /** * Subject 用户 * SecurityManager 管理所有用户 * Realm 连接数据 -- 做验证 */ @Bean("shiroFilterFactoryBean") public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager) { ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); bean.setSecurityManager(securityManager); Map<String,String> filterMap = new LinkedHashMap<>(); // 授权 /* anon: 无需认证就可访问 authc:必须认证才能访问 user:必须拥有记住我功能才能访问 perms: 拥有对某个资源的权限才能访问 roles:拥有某个角色权限才能访问 */ filterMap.put("/user/add",perms("user:add")); filterMap.put("/user/del",perms("user:del")); filterMap.put("/user/query",perms("user:query")); bean.setFilterChainDefinitionMap(filterMap); bean.setLoginUrl("/login"); bean.setUnauthorizedUrl("/noauth"); return bean; } @Bean(name = "securityManager") public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(userRealm); return securityManager; } @Bean(name = "userRealm") public UserRealm userRealm() { return new UserRealm(); } //整合thymeleaf @Bean public ShiroDialect getShiroDialect(){ return new ShiroDialect(); } /** * 拼接 perms[perms] * @param perms * @return */ private String perms(String perms) { return PERMS.replace("0",perms); } }

三、Controller 中

controller.java

import org.apache.catalina.security.SecurityUtil; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.IncorrectCredentialsException; import org.apache.shiro.authc.UnknownAccountException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class CommonController { @RequestMapping("/login") public String login(String username, String password, Model model) { Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username,password,true); try { subject.login(token); return "index"; }catch (UnknownAccountException e) { model.addAttribute("msg","用户名不存在"); return "login"; }catch (IncorrectCredentialsException e) { model.addAttribute("msg","密码错误"); return "login"; } } }

四、HTML 中

<!-- 开启提示需要在根标签html加上: xmlns:shiro="http://www.pollix.at/thymeleaf/shiro" --> <!-- 判断是否有此权限 --> <div shiro:hasPermission="user:add"> <a th:href="@{/user/add}">add</a> </div>

__EOF__

本文作者ZOLMK
本文链接https://www.cnblogs.com/zolmk/p/14074245.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   zolmk  阅读(145)  评论(0编辑  收藏  举报
编辑推荐:
· .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 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示