apache shiro学习笔记(四) Web Support

来源:互联网 发布:java博客推荐 编辑:程序博客网 时间:2024/05/29 14:01

一、配置

  1. web.xml(shiro1.2以后)

    #配置监听器<listener>org.apache.shiro.web.env.EnvironmentLoaderListener</listener>#配置shiro.ini文件位置<context-param><param-name>shiroConfigLocations</param-name><param-value>/WEB-INF/some/path/shiro.ini</param-value></context-param>#配置过滤器<filter><filter-name>shiroFilter</filter-name><filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class></filter><filter-mapping><filter-name>shiroFilter</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher><dispatcher>INCLUDE</dispatcher><dispatcher>ERROR</dispatcher></filter-mapping>
  2. web ini配置
    2.1 [urls]
    格式:_URL_ANT_PATH_EXPRESSION=_PATH_SPECIFIC_FILTER_CHAIN如:/account/**=ssl,authc(所有到应用路径下的/account或者他的子路径,都会触发ssl和authc过滤链,遵循先配置的生效原则)

    /account/**=ssl,authc/account/signup=anon

    有个请求是/account/signup/index.html,那么下面那条配置不会被执行。
    2.2 过滤链定义
    等号右边的格式:filter1[optional_config1],filter2[optional_config2],…,filterN[optional_configN]。定义逗号分割的顺序是你想让请求经过的过滤链。
    •filterN是在[main]区块被定义的过滤器
    •[optional_configN]:特定的过滤器,特定的路径

    filter的配置

    [main]
    myFilter=com.company.web.some.FilterImplementation
    myFilter.property1=value
    [urls]
    /some/path/**=myFilter

二、默认过滤器

过滤器名 全类名
anno————org.apache.shiro.web.filter.authc.AnnoymousFilter
authc————org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasic————org.apache.shiro.web.filter.BasicHttpAuthenticationFilter
logout————org.apache.shiro.web.filter.authc.LogoutFilter
noSessionCreation————org.apache.shiro.web.filter.session.NoSessionCreationFilter
perms————org.apache.shiro.web.filter.authz.PermissionAuthorizationFilter
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

三、启用和禁用过滤器

可以在filter的配置中删除filter来使filter无效。在shiro1.2之后,一个新特性添加可以时filter启用/禁用而不用删除它,如果启用(默认设置),请求会被如期的过滤。如果禁用,过滤器会允许请求立即通过去filterChain的下一个过滤器。
3.1 一般启用/禁用
设置一个过滤器的enabled属性为true或者false,默认的设置是true。

[main]ssl.enabled=false[urls]/another/path=ssl,roles[admin]

3.2 特定请求启用/禁用
OncePerRequestFilter实际上决定着过滤器在他的isEnabled(request,response)上是启用或者禁用的。这个方法默认返回enabled属性。如果你想让过滤器基于特定请求的尺度,可以重写OncePerRequestFilter.isEnabled(request,response)方法来表现更多的特定检查
3.3 特定路径启用/禁用
PathMatchingFilter是OncePerRequestFilter的子类,他可以回应基于特定路径的配置。如果你想要过滤器基于特定路径,你要重写PathMatchingFilter..isEnabled(request,response,path,pathConfig)方法

四、Session 管理

4.1 Servlet容器session
在web环境中,shiro默认的session管理器SessionManager是实现了ServletContainerSessionManager。

#配置servlet容器超时<session-config><session-timeout>30</session-timeout></session-config>

4.2 shiro自身的session
如果你想要你的session配置设置和集群在多种servlet容器中是便携的,或者你想控制特定的session/集群特性,你可以启用shiro的本身的session管理。它可以被用来支持所有的Subject和HttpServletRequest会话并且完全回避servlet容器
4.2.1 DefaultWebSessionManager
想要在web应用中启用自身的session管理,你需要配置一个自身的web-capable session管理来重写默认的那个基于servlet容器的session管理,一旦被配置,你可以设置DefaultWebSessionManager实例的属性,例如超时和集群。例如在ini文件中

[main]sessionManager=org.apache.shiro.web.session.mgt.DefaultWebSessionManagersecurityManager.sessionManager=$sessionManager。

4.2.2 session cookie
DefaultWebSessionManager支持两种特定web的配置属性:sessionIdCookieEnabled(这是一个boolean值)和sessionIdCookie(一个Cookie实例)。默认的sessionIdCookie实例是SimpleCookie。cookie的默认名是JSESSIONID。shiro的cookie支持HttpOnly标志。为了额外的安全,sessionIdCookie默认设置HttpOnly为true。

#配置cookie domain[main]securityManager.sessionManager.sessionIdCookie.domain=foo.com#禁用session cookie[main]securityManager.sessionManager.sessionIdCookieEnabled=false

五、记住我服务

如果AuthenticationToken实现了org.apache.shiro.authc.RememberMeAuthenticationToken接口,shiro将会提供rememberMe服务。这个接口提供了一个方法 boolean isRememberMe();如果这个方法返回值是true,shiro将会跨session记住终端用户的标识号。

#Java codeUsernamePasswordToken token=new UsernamePasswordToken(username,password);token.setRememberMe(true);SecurityUtils.getSubject().login(token);

5.1 form-based Login
在web应用中,默认的authc过滤器是FormAuthenticationFilter,它支持读取‘rememberMe’布尔值作为表单/请求参数。默认情况下,它期望请求参数被命名为rememberMe.FormAuthenticationFilter会检查请求参数username,password,rememberMe。如果使用不同的请求参数,需要做配置。

[main]authc.loginUrl=/login.jspauthc.usernameParam=somethingOtherThanUsernameauthc.passwordParam=somethingOtherThanPasswordauthc.rememberParam=somethingOtherThanRememberMe[urls]login.jsp=authc

5.2 cookie配置
你可以通过设置默认的{{RememberMeManager}}多种cookie属性配置rememberMe cookie运作方式。例如:

[main]securityManager.rememberMeManager.cookie.name=foosecurityManager.rememberManager.cookie.maxAge=blah

5.3 自定义的RmemberMeManager

[main]rememberMeManager=com.my.impl.RememberMeManagersecurityManager.rememberMeManager=$rememberMeManager

六、JSP/GSP标签库

6.1 标签库配置
TLD文件在shiro-web.jar文件中的META-INF/shiro.tld。使用标签,在jsp文件中添加标签声明。

<%@ taglib prefix="shiro" url="http://shiro.apache.org/tags" %>

6.2 guest标签
guest标签只有在当前Subject是guest时,它才会显示被包裹的内容。Guest是当前Subject没有标识。

<shiro:guest> hello there</shiro:guest>

6.3 user标签
user标签只有在当前Subject是user时,它才会显示被包裹的内容.user用户有已知的标识。用法同guest标签。
6.4 authenticated标签
只有当前的Subject在他们当前的session中被成功的识别,它才会显示内容。它比user标签更严格。

<shiro:authenticated> update you content</shiro:authenticated>

6.5 notAuthenticated标签
只有当前的Subject在他们当前的session中没有被成功的识别,它才会显示内容。用法同authenticated标签。
6.6 principal标签
它会输出Subject的principal或者是principal的一个属性。

hello,<shiro:principal/> ,how are you today.

principal标签默认输出subject.getPrincipal()值,但是如果你项输出的值不是主要的principal,而是在subject的集合中,你可以使用类型来确认principal要输出的值.

User ID:<pricipal type="java.lang.Integer" />

但是如果principal主要的principal或者typed是一个复杂的对象而不是一个简单的字符串。你可以使用property属性来表名要读取的名字的属性

#jsp codeHello ,<shiro:principal property="firstName"/>,how are you today?

或者两者结合

hello,<shiro:principal property="firstName" type="com.foo.user"/>,how are you today?

他等同于:

<%=SecurityUtils.getSubject().getPrincipals().oneByType(com.foo.user.Class).getFirstName().toString()%>

6.7 hasRole标签
只有当前的Subject被分配了特定的角色,它才会显示被包裹的内容。

<shiro:hasRole name="administrator"> hello administrator</shiro:hasRole>

6.8 lacksRole标签
只有当前的Subject没有被分配了特定的角色,它才会显示被包裹的内容。用法同hasRole
6.9 hasAnyRole标签
只有当前的Subject被分配了指定角色中的任意一个,它就会显示被包裹的内容。

<shiro:hasAnyRole name="developer,project manager,administrator">you’re either a developer,project manager,administrator</shiro:hasAnyRole>

6.10 hasPermission标签
只有当前的Subject有指定的权限,它才会显示被包裹的内容。

<shiro:hasPermission name="user:create"><a href="#">create a new user</a></shiro:hasPermission>

6.11 lacksPermission标签
只有当前的Subject有指定的权限,它才会显示被包裹的内容。用法同hasPermission。