SpringBoot 集成Shiro
Web 应用
Spring Web项目中,Shiro是通过过滤器来控制Web请求的
首先将Shiro的web-starter依赖添加到应用程序的类路径中,推荐采用Maven和Gradle
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;
}
缓存
只需提供一个CacheManager的bean即可开启缓存
@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