Spring 集成Shiro(注解方式)--官网

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的注解支持,只要导入了ShiroAnnotationProcessorConfigurationSpring配置类即可,然后就可以像下面这样使用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;
}

缓存

通过配置一个CacheManagerBean来开启缓存

@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页面)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342