Shiro配置方法详解:从零开始,手把手教你避开那些坑!
嘿,各位Java开发的小伙伴们,今天咱们来好好聊聊Shiro配置方法这个话题,说实话,我刚开始接触Shiro的时候,那叫一个头大啊!明明文档写得挺清楚的,但真到自己动手配置的时候,各种报错、各种不兼容,折腾得我差点想把电脑给砸了!不过呢,经过这几年的摸爬滚打,我现在也算是把Shiro配置方法摸得透透的了,今天就来跟大家分享一下我的实战经验,保证让你少走弯路!

初识Shiro:它到底是个啥?
咱们先别急着写代码,得先搞清楚Shiro是干嘛的,Shiro就是一个强大又灵活的Java安全框架,主要负责认证、授权、会话管理和加密这些事儿,哎呀,说白了就是帮你管好系统的“大门钥匙”和“房间权限”!跟Spring Security比起来,Shiro的配置方法可要简洁得多,这也是为啥我特别喜欢它的原因之一!
核心配置:从pom.xml开始
好了,咱们直接进入正题!Shiro配置方法的第一步,当然是把依赖加进来啦,在你项目的pom.xml里加上这段:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>1.9.1</version>
</dependency>
哎哟,这里我得提醒大家一句,版本选择真的超级重要!我之前用过一个老版本,结果跟Spring Boot 2.4+完全不兼容,那个调试过程简直是噩梦啊!所以大家一定要用1.7.1以上的版本,最好直接上最新版,省得后面出幺蛾子。
核心配置类:写一个ShiroConfig
有了依赖之后,咱们就需要建立一个配置类了,我通常会建一个ShiroConfig.java,里面有三个关键的东西:Realm、SecurityManager和ShiroFilterFactoryBean。
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 这行代码真的绝了!
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/logout", "logout");
filterChainDefinitionMap.put("/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
shiroFilterFactoryBean.setLoginUrl("/login");
shiroFilterFactoryBean.setUnauthorizedUrl("/403");
return shiroFilterFactoryBean;
}
}
哎呀,看到这段代码,是不是觉得Shiro配置方法也没那么复杂?我要说重点了,这里面的filterChainDefinitionMap的顺序真的超级重要啊!放在前面的规则会先匹配,所以一定要把anon这种放行规则写在authc前面,不然的话,哈哈,你懂的,登录页面都进不去,那就尴尬了!
Realm配置:连接数据源
接下来就是整个Shiro配置方法中我自认为最核心的部分——Realm了,Realm就像是Shiro和你的数据库之间的桥梁。
public class UserRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 这里就是做权限分配的地方啦
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
String username = (String) principals.getPrimaryPrincipal();
User user = userService.findByUsername(username);
// 给用户分配角色和权限
info.addRoles(user.getRoles());
info.addStringPermissions(user.getPermissions());
return info;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 认证的核心逻辑
String username = (String) token.getPrincipal();
User user = userService.findByUsername(username);
if (user == null) {
throw new UnknownAccountException("用户不存在");
}
// 返回认证信息,密码验证交给Shiro去处理
return new SimpleAuthenticationInfo(username, user.getPassword(), getName());
}
}
说真的,写这块代码的时候,我无数次感叹Shiro的设计真的挺人性化的,密码校验、加密这些脏活累活Shiro都帮你干完了,你只需要把用户数据提供给它就完事儿了。
密码加密那些事儿
好了好了,我知道你们肯定关心这个——密码不能明文存储对吧!Shiro配置方法里有个超级好用的东西叫HashedCredentialsMatcher,用于密码校验。
@Bean
public UserRealm userRealm() {
UserRealm userRealm = new UserRealm();
HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
matcher.setHashAlgorithmName("MD5");
matcher.setHashIterations(2);
userRealm.setCredentialsMatcher(matcher);
return userRealm;
}
哈哈,看到没有,两行代码就搞定了MD5加密,Shiro真的很香啊!不过这里我得插一嘴,虽然MD5够用,但我个人建议追求安全的兄弟们可以换SHA-256或者加盐,毕竟现在网络安全形势,你懂的!
前端整合:一个接口搞定
最后一步,咱们得把Shiro跟SpringMVC整合起来,一般我会写一个通用的Controller来处理登录请求:
@PostMapping("/login")
@ResponseBody
public Result login(String username, String password) {
Subject subject = SecurityUtils.getSubject();
try {
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
subject.login(token);
return Result.success("登录成功");
} catch (AuthenticationException e) {
// 验证失败就返回错误信息
return Result.error("用户名或密码错误");
}
}
哎呀,看到这里是不是特别有成就感?一个完整的登录流程就这么搞定了!Shiro会帮你自动处理session、密码比对这些工作,咱们只需要关注业务逻辑就好,简直不要太省心!
总结一下下
好啦,今天关于Shiro配置方法的分享就这么多了,说真的,Shiro的配置方法掌握了之后,你会发现它真的超级好用,虽然现在Spring Security也很火,但Shiro的轻量级特性和简单配置方法,让它依然有着不可替代的地位,遇到问题的时候别慌,多看文档、多调试,慢慢你就会发现,其实Shiro配置方法真的没有想象中那么难!
最后提醒一句,配置完之后一定要测试哦,特别是权限拦截这块儿,我就曾经因为漏配了一个放行规则,结果测试的时候差点被自己锁在系统外面,那种感觉,啧啧,真心酸爽!
好啦,希望这篇文章能帮到正在学习Shiro配置方法的你!有什么问题随时在评论区问我,只要我不加班,看到就会回复的!加油!💪