springboot 简单使用shiro登录
首先引入需要的pom
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-web-starter</artifactId> <version>1.4.1</version> </dependency>
配置application.properties
#登录界面 shiro.loginUrl=/login #无权限界面 shiro.unauthorizedUrl=/403 #成功界面 shiro.successUrl=/index
自定义UserRealm
public class UserRealm extends AuthorizingRealm { @Autowired private UserService userService; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { if(principalCollection == null){ throw new AuthenticationException("PrincipalCollection参数不能为空。"); } TUser user = (TUser) getAvailablePrincipal(principalCollection); if(ObjectUtils.isEmpty(user)){ throw new AuthenticationException("用户不存在"); } SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); if(ObjectUtils.isEmpty(user.getRole())){ info.setRoles(new HashSet<String>(){{add("public");}}); }else{ info.setRoles(new HashSet<String>(){{add(user.getRole());}}); } return info; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; String username = token.getUsername(); if(StringUtils.isEmpty(username)){ throw new UnknownAccountException(); } TUser user = userService.fetchByUsername(username); if(ObjectUtils.isEmpty(user)){ throw new UnknownAccountException(); } if(user.getDisabled()){ throw new LockedAccountException(); } SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getPassword(),ByteSource.Util.bytes(user.getSalt()),getName()); return info; } }
添加用户时密码加密方法
public String md5(String password,String salt){ //加密方式 String algorithmName = "MD5"; //盐值 ByteSource byteSalt = ByteSource.Util.bytes(salt); //加密次数 int hashIterations = 6; SimpleHash result = new SimpleHash(algorithmName, password, byteSalt, hashIterations); //Md2Hash Md5Hash Sha1Hash Sha256Hash Sha384Hash Sha512Hash 最后都是调用SimpleHash加密 //Md5Hash r = new Md5Hash(password,byteSalt,hashIterations); return result.toHex(); }
配置 ShiroConfig
@Configuration public class ShiroConfig { @Bean public Realm realm(){ UserRealm userRealm = new UserRealm(); userRealm.setCredentialsMatcher(hashedCredentialsMatcher()); return userRealm; } /** * 配置url * anon 任何人都能访问 * authc 认证成功后才能访问 */ @Bean public ShiroFilterChainDefinition shiroFilterChainDefinition(){ DefaultShiroFilterChainDefinition chain = new DefaultShiroFilterChainDefinition(); Map<String,String> pathDefinitions = new HashMap<>(); pathDefinitions.put("/loginDo","anon"); pathDefinitions.put("/**","authc"); chain.addPathDefinitions(pathDefinitions); return chain; } /** * 密码验证 * @return */ @Bean public HashedCredentialsMatcher hashedCredentialsMatcher(){ HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher(); credentialsMatcher.setHashAlgorithmName("MD5"); credentialsMatcher.setHashIterations(6); credentialsMatcher.setStoredCredentialsHexEncoded(true); return credentialsMatcher; } }
登录controller
@PostMapping("/loginDo") @ResponseBody public Result loginDo(String username, String password, boolean rememberMe) { if(StringUtils.isEmpty(username)){ return Result.error("请输入用户名"); } if(StringUtils.isEmpty(password)){ return Result.error("请输入密码"); } try { Subject subject = SecurityUtils.getSubject(); subject.login(new UsernamePasswordToken(username, password, rememberMe)); } catch (UnknownAccountException e1) { return Result.error("用户名或密码错误"); } catch (LockedAccountException e2) { return Result.error("用户已被锁定"); } catch (AuthenticationException e3) { return Result.error("登录失败"); } return Result.success(); }
分类:
spring
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端