SpringBoot 集成Shiro--官网

SpringBoot 集成Shiro

Web 应用

Spring Web项目中,Shiro是通过过滤器来控制Web请求的

首先将Shiro的web-starter依赖添加到应用程序的类路径中,推荐采用MavenGradle

maven

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

gradle

compile 'org.apache.shiro:shiro-spring-boot-web-starter:1.7.1'

然后提供一个Realm的实现

@Bean
public Realm realm() {
    ...
}

最后添加一个ShiroFilterChainDefinition到容器中,它指定了URL路径及其对应的过滤器链

@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition(){
    DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
    
    chainDefinition.addPathDefinition("/admin/**", "authc, roles[admin]");
    
    chainDefinition.addPathDefinition("/docs/**", "authc, perms[document:read]");
    
    chainDefinition.addPathDefinition("/**", "authc");
    
    return chainDefinition;
}

完整示例参考github

开启Shiro的注解支持

如果包含了前面的shiro-spring-boot-web-starter,则就会自动开启Shiro的注解支持

@RequiresPermissions("document:read")
public void readDocument() {
    ...
}

注解与Web应用程序

Shiro的注解可以在@Controller类中使用,如下

@Controller
public class AccountInfoController {
    
    @RequiresRoles("admin")
    @RequestMapping("/admin/config")
    public String adminConfig(Model model) {
        return "view";
    }
}

为了确保应用程序工作,至少需要一个ShiroFilterChainDefinition,并且其中至少包含了一个URL的过滤器链,要么配置所有的路径均可以匿名访问,要么就配置一个过滤器来过滤请求

@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
    DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
    
    chainDefinition.addPathDefinition("/**", "anno");
    
    return chainDefinition;
}

缓存

只需提供一个CacheManagerbean即可开启缓存

@Bean
protected CacheManager cacheManager() {
    return new MemoryConstrainedCacheManager();
}

配置属性

属性名 默认值 描述
shiro.enabled true 开启Shiro的Spring模块
shiro.web.enabled true 开启Shiro的Spring web模块
shiro.annotations.enabled true 开启Shiro的注解支持
shiro.sessionManager.deleteInvalidSessions true 是否从会话存储中删除过期会话
shiro.sessionManager.sessionIdCookieEnabled true 是否将SessionID放到Cookie中
shiro.sessionManager.sessionIdUrlRewritingEnabled true 开启Session的URL重写
shiro.userNativeSessionManager false 是否开启Shiro的原生会话管理
shiro.sessionManager.cookie.name JSESSIONID Session的Cookie名字
shiro.sessionManager.cookie.maxAge -1 Session的Cookie的有效期
shiro.sessionManager.cookie.domain null Session的Cookie的域名
shiro.sessionManager.cookie.path null Session的Cookie的路径
shiro.sessionManager.cookie.secure false 是否开启安全标识
shiro.rememberMeManager.cookie.name rememberMe
shiro.rememberMeManager.cookie.MaxAge 一年
shiro.rememberMeManager.cookie.domain null
shiro.rememberMeManager.cookie.path null
shiro.rememberMeManager.cookie.secure false
以上几个属性是设置rememberMe用的cookie的配置
shiro.loginUrl /login.jsp 登录的界面URL
shiro.successUrl / 默认登录成功后的跳转界面
shiro.unauthorizedUrl null 没有权限时的错误界面(403)

非Web应用

同Web应用一样,需要先添加shiro-spring-boot-starter依赖,配置也一样

然后配置一个realm

@Bean
public Realm realm() {
    ...
}

最后为了使得SecurityUtils.*方法生效,只需要使得SecurityManager的bean设置到SecurityUtils即可

@Autowire
private SecurityManager securityManager;

@PostConstruct
private void initStaticSecurityManager() {
    SecurityUtils.setSecurityManager(securityManager);
}

接下来就可以像下面这样获取Subject

SecurityUtils.getSubject();

完整示例参考github

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容