Spring集成Shiro(注解方式)
非Web应用
首先往应用程序类路径中添加Shiro-Spring
的依赖,推荐使用Maven
或者Gradle
maven
<dependency>
<groupId>org.apache.shiro</groupId>
<artifictId>shiro-spring</artifictId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
gradle
compile 'org.apache.shior:shiro-spring:1.7.1'
compile 'org.springframework:spring-context:${spring.version}'
导入以下Shiro-Spring
配置
@Configuration
@Import({
ShiroBeanConfiguration.class,
ShiroConfiguration.class,
ShiroAnnotationProcessorConfiguration.class
})
public class CliAppConfig{
...
}
说明如下
配置类 | 描述 |
---|---|
org.apache.shiro.spring.config.ShiroBeanConfiguration | 配置Shiro的生命周期和事件 |
org.apache.shiro.spring.config.ShiroConfiguration | 配置Shiro的安全组件,如SecurityManager 等 |
org.apache.shiro.spring.config.ShiroAnnotationProcessorConfiguration | 开启Shiro的注解支持 |
剩下的事情就是配置一个Realm
@Bean
public Realm realm(){
...
}
为了能够使用SecurityUtils
下的所有方法,最简单的就是为其设置一个SecurityManager
,注意不要在Web应用中这样做,详情请看下面
@Autowired
private SecurityManager securityManager;
@PostConstruct
private void initStaticSecurityManager() {
SecurityUtils.setSecurityManager(securityManager);
}
之后,就可以按照下面的方式获取当前的Subject
SecurityUtils.getSubject();
完整示例查看github
Web 应用
在Web应用中,是通过过滤器的方式来使得请求经过Shiro的,这个过滤器本身非常强大,允许基于任何URL路径表达式执行自定义过滤器链
一样需要在应用程序类路径中包含Shiro Spring
的web依赖,推荐使用maven
或者gradle
maven
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
gradle
compile 'org.apache.shiro:shiro-spring:1.7.1'
compile 'org.apache.shiro:shiro-web:1.7.1'
compile 'org.springframework:spring-webmvc:${spring.version}'
接下来导入Shiro-Spring
配置
@Configuration
@Import({
ShiroBeanConfiguration.class,
ShiroAnnotationProcessorConfiguration.class,
ShiroWebConfiguration.class,
ShiroWebFilterConfiguration.class,
ShiroRequestMappingConfig.class
})
public class ApplicationConfig{
...
}
说明如下
配置类 | 描述 |
---|---|
org.apache.shiro.spring.config.ShiroBeanConfiguration | 配置Shiro的生命周期和事件 |
org.apache.shiro.spring.config.ShiroAnnotationProcessorConfiguration | 开启Shiro的注解支持 |
org.apache.shiro.spring.web.config.ShiroWebConfiguration | 配置用于web的Shiro的Bean |
org.apache.shiro.spring.web.config.ShiroWebFilterConfiguration | 配置Shiro的Web过滤器 |
org.apache.shiro.spring.web.config.ShiroRequestMappingConfig | 为Spring配置Shiro的UrlPathHelper 实现,确保URL能被正确的处理 |
然后配置一个Realm
@Bean
public Realm realm() {
...
}
最后配置一个ShiroFilterChainDefinition
,它包含了特定URL路径及其过滤器链,来控制访问请求
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
chainDefinition.addPathDefinition("/admin/**", "authc, roles[admin]");
chainDefinition.addPathDefinition("/dosc/**", "authc, perms[document:read]");
chainDefinition.addPathDefinition("/**", "authc");
return chainDefinition;
}
完整示例查看github
开启Shiro注解
无论在Web应用还是非Web应用中,都可以开启Shiro的注解支持,只要导入了ShiroAnnotationProcessorConfiguration
的Spring
配置类即可,然后就可以像下面这样使用Shiro的注解了
@RequiresPermissions("document:read")
public void readDocument() {
...
}
注解与Web应用
在@Controller的类中使用Shiro的注解
@Controller
public class AccountInfoController {
@RequiresRoles("admin")
@RequestMapping("/admin/config")
public String adminConfig(Model model){
return "view";
}
}
需要一个至少具有一个定义的ShiroFilterChainDefinition
bean才能工作,要么配置所有路径通过anon
过滤器访问,要么配置一个允许模式的过滤器,例如:authcBasic[permissive]
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
// 所有的路径均可以匿名访问
chainDefinition.addPathDefinition("/**", "anon");
// 或者需要一个HTTP基本认证
// chainDefinition.addPathDefinition("/**", "authcBasic[permissive]")
return chainDefinition;
}
缓存
通过配置一个CacheManager
的Bean
来开启缓存
@Bean
protected CacheManager cacheManager() {
return new MemoryConstrainedCacheManager();
}
配置属性
Key | 默认值 | 描述 |
---|---|---|
shiro.sessionManager.deleteInvalidSessions | true | 从会话存储区中删除失效会话 |
shiro.sessionManager.sessionIdCookieEnabled | true | 将SessionID放到Cookie中,便于追踪 |
shiro.sessionManager.sessionIdUrlRewritingEnabled | true | 开启会话URL重写 |
shiro.userNativeSessionManager | false | 是否启用Shiro的原生会话管理 |
shiro.sessionManager.cookie.name | JSESSIONID | 会话Cookie名字 |
shiro.sessionManager.cookie.maxAge | -1 | 会话Cookie的有效期 |
shiro.sessionManager.cookie.domain | null | 会话Cookie的域 |
shiro.sessionManager.cookie.path | null | 会话Cookie的路径 |
shiro.sessionManager.cookie.secure | false | 会话Cookie的安全标识 |
shiro.rememberMeManager.cookie.name | rememberMe | "记住我"Cookie的名字 |
shiro.rememberMeManager.cookie.maxAge | one year | "记住我"Cookie的有效期 |
shiro.rememberMeManager.cookie.domain | null | "记住我"Cookie的域名 |
shiro.rememberMeManager.cookie.path | null | "记住我"Cookie的路径 |
shiro.rememberMeManager.cookie.secure | false | "记住我"Cookie的安全标识 |
shiro.loginUrl | /login.jsp | 未认证时重定向到哪个路径 |
shiro.successUrl | / | 登陆后默认的跳转界面 |
shiro.unauthorizedUrl | null | 没有权限时的错误界面(403页面) |