しろ
Shiro的名字是日语 “城” 的发音(拼音谐音 xi luo),根据Wiki百科是在2004年由 Les Hazlewood and Jeremy Haile 主持编写的,这两个人的名字怎么看都不像日本人,不知道是不是动漫看多了起了这么一个中二的名字。
Shiro的工作机制对于当时还是菜鸡的我 十分复杂 ,况且网上的教程还都过于长篇大论,本系列的目的在于: 针对SpringMVC+Spring框架下Shiro的集成和应用进行 入门讲解
Spring君 一緒だよ
根据官方文档与Spring进行集成是十分复杂的的一个操作,需要对Shiro有个细致对了解,这里对集成步骤进行分步讲解
Shiro的核心: Security Manager
Shiro的核心是Security Manager对下对接数据库对上对接Web或者Java服务,夹在两层之间,主要有以下几个功能 “()”中是白话解释,不是很准确
- Authentication: 认证(用户密码是不是输入对了)
- Authorization: 授权(看能不能进行操作,类似于看你是VIP会员还是屌丝会员)
- Realm: 域(此概念是核心中的核心 会有单独讲解 这里只需要记住名字即可)
- Session: 状态管理,同WebSession概念(需要了解Session是什么,但是如果不了解可以略过)
- Cache: 缓存(可以暂时略过)
经过分析我们了解到1-3三项其实是Security Manager的主要职责,而 4-5可以暂时忽略 当然如果你有相关知识的储备更好,所以我们可以得出初步的配置文件,将其写入Spring的配置文件 applicationContext.xml
1 | // 1. 将Shiro的生命周期加入Spring |
由于Spring本身只是一个控制反转容器,并不一定提供Web服务,所以使用了 org.apache.shiro.mgt.DefaultSecurityManager 在SpringMVC+Spring的Web服务框架下还有另外一个SecurityManager
Security Manager | Class名 |
---|---|
Spring | org.apache.shiro.mgt.DefaultSecurityManager |
SpringMVC+Spring | org.apache.shiro.web.mgt.DefaultWebSecurityManager |
Security Manager的核心: Realm
Realm是Security Manager用来保存主体信息的,所谓主体信息可以狭义的理解成用户名和密码(但是并不准确),将会在 下一章进行详细讲解如何写配置文件里的
1 | <bean id="myRealm" class="...">...</bean> |
Security Manager如何工作
Security Manager有4种工作方式, 且这 四种工作方式可以混合使用
- 基于代码的单例工作模式 SecurityUtils
- 基于配置文件的过滤器工作模式 filter
- 基于注解的工作方式
- 基于JSP的标签
SecurityUtils的配置
在Spring的 applicationContext.xml 中加入如下配置
1 | <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> |
就可以在代码中使用SecurityUtils进行角色和权限的判断, 如果不具有相应的角色和权限,SecurityUtils会抛出Exception
1 | SecurityUtils.getSubject().checkRole("admin"); |
filter的配置
除了使用代码里进行手动判断,还可以根据servlet的过滤器来实现,
web.xml中的配置
首先在web.xml文件中加入Shiro的过滤器,并且对所有地址进行过滤
1 | <filter> |
applicationContext.xml中的配置
在配置好过滤器之后,可以在Spring的 applicationContext.xml 里配置
1 |
|
在value中各种配置字段的意义在官方文档Web-URLPathExpressions有如下说明
过滤器名称 | 过滤器作用 | 对应Class |
---|---|---|
anon | 允许匿名访问 | org.apache.shiro.web.filter.authc.AnonymousFilter |
authc | 需要登陆访问 | org.apache.shiro.web.filter.authc.FormAuthenticationFilter |
authcBasic | 咦?不知道和上个啥区别 | org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter |
logout | 登出 | org.apache.shiro.web.filter.authc.LogoutFilter |
noSessionCreation | 访问时不创建Session | org.apache.shiro.web.filter.session.NoSessionCreationFilter |
perms | 需要权限 | org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter |
port | 需要端口 | org.apache.shiro.web.filter.authz.PortFilter |
rest | 不明 | org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter |
roles | 需要角色 | org.apache.shiro.web.filter.authz.RolesAuthorizationFilter |
ssl | 需要SSL访问 | org.apache.shiro.web.filter.authz.SslFilter |
user | 需要用户 | org.apache.shiro.web.filter.authc.UserFilter |
注解的配置
注解是可以使用 @RequiresPermissions 等注解对方法进行Shiro的权限控制,需要以下配置
1 | <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/> |
但是这里有一个大坑 : 这两句配置应该加载在哪个配置文件里?
根据官方文档
- Just add these two bean definitions to applicationContext.xml
但是官方文档是指 Spring+Shiro 的情况,在 SpringMVC+Spring+Shiro的情况下,如果想在Controller里生效
这两句Bean应该放在SpringMVC的配置文件spring-mvc.xml下 原因见Shiro在SpringMVC+Spring下注解不生效
JSP标签的配置
在JSP标签的Shiro配置
1 | <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> |
具体的使用方法,我没有过多的研究,请参考官方文档JSP / GSP Tag Library
讲了这么多配置才刚刚过了一半
通过Shiro的前三种工作方式,我们可以发现他们都必须依赖于securityManager的配置,但是securityManager中的realm选项还没进行过配置,下一章我们将详细解释什么是Realm以及如何配置。