Shiro的Spring-Boot集成是将Shiro集成到基于Spring的应用程序中的最简单方法,用于更一般的Spring Framework集成,采用注释或XML指南。
独立应用程序
在您的应用程序类路径中包含Shiro Spring启动程序依赖项(我们建议使用Apache Maven或Gradle等工具来管理它)。
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>1.5.0-SNAPSHOT</version>
</dependency>
剩下的唯一事情就是配置一个领域:
@Bean
public Realm realm() {
...
}
设置Shiro的最简单方法是使所有SecurityUtils。*方法在所有情况下都能工作,就是让SecurityManagerbean成为一个静态单例。请勿在Web应用程序中执行此操作 - 请参阅下面的“ Web应用程序”部分。
@Autowired
private SecurityManager securityManager;
@PostConstruct
private void initStaticSecurityManager() {
SecurityUtils.setSecurityManager(securityManager);
}
就是这样,现在您可以Subject使用以下内容:
SecurityUtils.getSubject();
Web应用程序
Shiro拥有Spring Web应用程序的一流支持。在Web应用程序中,所有可通过Shiro访问的Web请求都必须通过主Shiro过滤器。此过滤器本身非常强大,允许基于任何URL路径表达式执行临时自定义过滤器链。
首先在您的应用程序类路径中包含Shiro Spring Web启动程序依赖项(我们建议使用Apache Maven或Gradle等工具来管理它)。
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-web-starter</artifactId>
<version>1.5.0-SNAPSHOT</version>
</dependency>
提供Realm实现:
@Bean
public Realm realm() {
...
}
最后ShiroFilterChainDefinition,它将把任何特定于应用程序的路径映射到给定的过滤器,以便允许不同路径的不同访问级别。
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
// logged in users with the 'admin' role
chainDefinition.addPathDefinition("/admin/**", "authc, roles[admin]");
// logged in users with the 'document:read' permission
chainDefinition.addPathDefinition("/docs/**", "authc, perms[document:read]");
// all other paths require a logged in user
chainDefinition.addPathDefinition("/**", "authc");
return chainDefinition;
}
如果您使用的是Shiro的注释,请参阅下面的注释部分。
启用Shiro注释
在两个独立的和Web应用程序,你可能需要使用Shiro的安全检查注释(例如@RequiresRoles,@RequiresPermissions等),这些注释上面列出双方首发自动启用。
只需注释您的方法即可使用它们:
@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与至少一个定义豆仍需要对于这项工作,无论是配置所有路径是经由accessable anon滤波器或“许可”模式中的过滤器,例如:authcBasic[permissive]。
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
chainDefinition.addPathDefinition("/**", "anon"); // all paths are managed via annotations
// or allow basic authentication, but NOT require it.
// chainDefinition.addPathDefinition("/**", "authcBasic[permissive]");
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的注释启用Spring支持 |
shiro.sessionManager.deleteInvalidSessions | true | 从会话存储中删除无效会话 |
shiro.sessionManager.sessionIdCookieEnabled | true | 启用会话ID到cookie,以进行会话跟踪 |
shiro.sessionManager.sessionIdUrlRewritingEnabled | true | 启用会话URL重写支持 |
shiro.userNativeSessionManager | false | 如果启用,Shiro将管理HTTP会话而不是容器 |
shiro.sessionManager.cookie.name | JSESSIONID | 会话cookie名称 |
shiro.sessionManager.cookie.maxAge | -1 | 会话cookie最大年龄 |
shiro.sessionManager.cookie.domain | 空值 | 会话cookie域 |
shiro.sessionManager.cookie.path | 空值 | 会话cookie路径 |
shiro.sessionManager.cookie.secure | false | 会话cookie安全标志 |
shiro.rememberMeManager.cookie.name | rememberMe | RememberMe cookie名称 |
shiro.rememberMeManager.cookie.maxAge | 一年 | RememberMe cookie最大年龄 |
shiro.rememberMeManager.cookie.domain | 空值 | RememberMe cookie域名 |
shiro.rememberMeManager.cookie.path | 空值 | RememberMe cookie路径 |
shiro.rememberMeManager.cookie.secure | false | RememberMe cookie安全标志 |
shiro.loginUrl | /login.jsp | 未经身份验证的用户重定向到登录页面时使用的登录URL |
shiro.successUrl | / | 用户登录后的默认登录页面(如果在当前会话中找不到替代) |
shiro.unauthorizedUrl | 空值 | 页面将用户重定向到未授权的位置(403页) |