Shiro配置方法

极客

Shiro配置方法详解:从零开始,手把手教你避开那些坑!

嘿,各位Java开发的小伙伴们,今天咱们来好好聊聊Shiro配置方法这个话题,说实话,我刚开始接触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配置方法的你!有什么问题随时在评论区问我,只要我不加班,看到就会回复的!加油!💪

文章版权声明:除非注明,否则均为极客网安-咸鱼原创文章,转载或复制请以超链接形式并注明出处。

目录[+]