(一)shrio简介
1、什么是 apache shiro :
Apache Shiro是一个功能强大且易于使用的Java安全框架,提供了认证,授权,加密,和会话管理
如同 Spring security 一样都是是一个权限安全框架,但是与Spring Security相比,在于他使用了和比较简洁易懂的认证和授权方式。
2、Apache Shiro 的三大核心组件:
1、
Subject
:当前用户的操作。即当前用户,在权限管理的应用程序里往往需要知道谁能够操作什么,谁拥有操作该程序的权利,shiro中则需要通过Subject来提供基础的当前用户信息,Subject 不仅仅代表某个用户,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。
2、
SecurityManager
:用于管理所有的Subjec。即所有Subject的管理者,这是Shiro框架的核心组件,可以把他看做是一个Shiro框架的全局管理组件,用于调度各种Shiro框架的服务。
3、
Realms:
用于进行权限信息的验证。是用户的信息认证器和用户的权限人证器,我们需要自己来实现Realms来自定义的管理我们自己系统内部的权限规则。
3、
shiro的用户权限认证过程中的
实现方法
:
Authentication 和 Authorization
在shiro的用户权限认证过程中其通过两个方法来实现:
1、Authentication:是验证用户身份的过程。
2、Authorization:是授权访问控制,用于对用户进行的操作进行人证授权,证明该用户是否允许进行当前操作,如访问某个链接,某个资源文件等。
4
、其他组件:
除了以上几个组件外,Shiro还有几个其他组件:
1
、
SessionManager
:
Shiro为任何应用提供了一个会话编程范式。
2、
CacheManager
:对Shiro的其他组件提供缓存支持。
(二)shrio操作
1:shrio在web.xml中的配置
- <!--==================shiro过虑器====================-->
- <!-- shiro过虑器,DelegatingFilterProx会从spring容器中找shiroFilter代理模式(律师模式) -->
- <filter>
- <filter-name>shiroFilter</filter-name>
- <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
- <!--设置为true有servlet容器控制filter声明周期-->
- <init-param>
- <param-name>targetFilterLifecycle</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>shiroFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
2:在applicationContext-shrio.xml中的配置
- <!-- Shiro 的Web过滤器 -->
- <!--1、与web.xml对应的bean-->
- <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
- <property name="securityManager" ref="securityManager" />
- <!-- 如果没有认证将要跳转的登陆地址,http可访问的url,如果不在表单认证过虑器FormAuthenticationFilter中指定此地址就为身份认证地址 -->
- <property name="loginUrl" value="/login.action" />
- <!-- 没有权限跳转的地址 -->
- <property name="unauthorizedUrl" value="/pages/jsp/refuse.jsp" />
- <!--过滤定义,从上而下,蒋匿名的anon放最下面-->
- <property name="filterChainDefinitions">
- <value>
- /** anon
- </value>
- </property>
- </bean>
- <!-- 2、安全管理器 -->
- <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
- <property name="realm" ref="userRealm" />
- </bean>
- <!--3、realm-->
- <bean id="userRealm" class="com.ycy.shiro.CustomRealm"/>
3: shrio过滤器
上面所说的过滤器需要配置文件,配置如下
过滤器简称
| |
anon
|
org.apache.shiro.web.filter.authc.AnonymousFilter
|
authc
|
org.apache.shiro.web.filter.authc.FormAuthenticationFilter
|
authcBasic
|
org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
|
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
|
org.apache.shiro.web.filter.authz.SslFilter
|
user
|
org.apache.shiro.web.filter.authc.UserFilter
|
logout
|
org.apache.shiro.web.filter.authc.LogoutFilter
|
(1)通常可将这些过滤器分为两组
- anon,authc,authcBasic,user是第一组认证过滤器
- perms,port,rest,roles,ssl是第二组授权过滤器
- 注意user和authc不同:当应用开启了rememberMe时,用户下次访问时可以是一个user,但绝不会是authc,因为authc是需要重新认证的
- user表示用户不一定已通过认证,只要曾被Shiro记住过登录状态的用户就可以正常发起请求,比如rememberMe
- 说白了,以前的一个用户登录时开启了rememberMe,然后他关闭浏览器,下次再访问时他就是一个user,而不会authc
例:
- /admin=authc,roles[admin] 表示用户必需已通过认证,并拥有admin角色才可以正常发起'/admin'请求
- /edit=authc,perms[admin:edit] 表示用户必需已通过认证,并拥有admin:edit权限才可以正常发起'/edit'请求
- /home=user 表示用户不一定需要已经通过认证,只需要曾经被Shiro记住过登录状态就可以正常发起'/home'请求
(2)各默认过滤器常用如下(注意URL Pattern里用到的是两颗星,这样才能实现任意层次的全匹配)
- /admins/**=anon 无参,表示可匿名使用,可以理解为匿名用户或游客
- /admins/user/**=authc 无参,表示需认证才能使用
- /admins/user/**=authcBasic 无参,表示httpBasic认证
- /admins/user/**=user 无参,表示必须存在用户,当登入操作时不做检查
- /admins/user/**=ssl 无参,表示安全的URL请求,协议为https
- /admins/user/**=perms[user:add:*]
- 参数可写多个,多参时必须加上引号,且参数之间用逗号分割,如/admins/user/**=perms["user:add:*,user:modify:*"]
- 当有多个参数时必须每个参数都通过才算通过,相当于isPermitedAll()方法
- /admins/user/**=port[8081]
- 当请求的URL端口不是8081时,跳转到schemal://serverName:8081?queryString
- 其中schmal是协议http或https等,serverName是你访问的Host,8081是Port端口,queryString是你访问的URL里的?后面的参数
- /admins/user/**=rest[user]
- 根据请求的方法,相当于/admins/user/**=perms[user:method],其中method为post,get,delete等
- /admins/user/**=roles[admin]
- 参数可写多个,多个时必须加上引号,且参数之间用逗号分割,如/admins/user/**=roles["admin,guest"]
- 当有多个参数时必须每个参数都通过才算通过,相当于hasAllRoles()方法
(3)
总结登录退出实例5步走
1、web.xml配置shiroFileter拦截器
2、applicationContext-shiro配置:1、首先配置 shiroFileter 2、设置securityManager 3、设置过滤表达式 4、设置我们自己的realm
3、再配置loginController,根据异常返回用户认证错误信息
4、配置FristController,从securityUtil.getInstance(),加入环境。然后获取subject主体,再用属性注入到实体
5、在frist.jsp 获取controller传入的activeUser数据展示。