返回

用 Shiro 武装 Spring Boot:无懈可击的安全堡垒

见解分享

Spring Boot 以其轻量级和开发效率而广受青睐,但它对安全性的原生支持却有些不足。为了填补这一空白,Shiro 横空出世,为 Spring Boot 应用提供了一套全面且可扩展的安全解决方案。

1. 携手同行:Shiro 与 Spring Boot

要将 Shiro 与 Spring Boot 集成,首先需要添加 Maven 依赖:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-starter</artifactId>
    <version>2.4.0</version>
</dependency>

2. 权限与认证的守护神:ShiroRealm

ShiroRealm 是 Shiro 的核心组件,负责处理用户的身份验证和授权。通过继承 AuthorizingRealm,我们可以定义自己的 ShiroRealm 实现:

@Component
public class MyShiroRealm extends AuthorizingRealm {

    // 自定义身份验证逻辑
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //...
    }

    // 自定义授权逻辑
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        //...
    }
}

3. 运筹帷幄:ShiroConfig

ShiroConfig 是 Shiro 的配置中心,负责将 Shiro 与 Spring Boot 应用整合:

@Configuration
public class ShiroConfig {

    @Bean
    public DefaultWebSecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(myShiroRealm());
        return securityManager;
    }

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        //...
        return shiroFilterFactoryBean;
    }
}

4. 层层把关:ShiroFilter

ShiroFilter 负责拦截和处理请求,执行必要的安全检查:

shiroFilterFactoryBean.setFilterChainDefinitionMap(new HashMap<String, String>() {
    {
        put("/login", "anon"); // 匿名访问
        put("/**", "authc"); // 需认证
    }
});

5. 强力保障:Shiro注解

Shiro 提供了丰富的注解,可以方便地进行权限控制:

@RequiresAuthentication // 要求登录
@RequiresPermissions("user:add") // 要求具有添加用户的权限