Apache Shiro Web Support

1. 配置

将 Shiro 整合到 Web 应用中的最简单方式是在 web.xml 的 Servlet ContextListener 和 Filter 中添加 shiro 的 ini 配置。

与 Spring 的整合(Spring-specific web configuration)在文末说明

1.1 web.xml

Shiro 1.2 and later(Shiro 1.1及早期版本参照官方页面)

<listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>
... <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>

上述配置假定 shiro.ini 配置文件位于下列地址之一,使用最先获取到的文件:

1. /WEB_INF/shiro.ini

2. classpath 根目录下的 shiro.ini

上述配置的作用:

-  EnvironmentLoaderListener 初始化 Shiro的 WebEnvironment 实例(包括SecurityManager),并使其可在 ServletContext 中访问。如果需要获取 WebEnvironment 实例,可调用 WebUtils.getRequiredWebEnvironment(servletContext)

ShiroFilter 将使用 WebEnvironment 来对所有被过滤的请求执行必要的安全操作.

filter-mapping定义保证了所有请求都将被 ShiroFilter 过滤,这是保证任意请求都是安全的的推荐配置。

通常将 ShiroFilter filter-mapping 配置在其他 filter-mapping 之前,以确保 Shiro 在其他 过滤器中也能起作用。

自定义 WebEnvironment 类配置

EnvironmentLoaderListener 默认会创建一个 IniWebEnvironment 实例,其假定Shiro是采用的 ini 配置。如需要修改默认ini配置或采用其他格式的配置(如 xml),可在 web.xml 中配置自定义的 WebEnvironment

<context-param>
    <param-name>shiroEnvironmentClass</param-name>
    <param-value>com.foo.bar.shiro.MyWebEnvironment</param-value>
</context-param>
自定义配置文件位置

若配置文件不是存放在默认目录下,则需在 web.xml 中进行配置:

<context-param>
    <param-name>shiroConfigLocations</param-name>
    <param-value>YOUR_RESOURCE_LOCATION_HERE</param-value>
</context-param>

param-value的值可以是 /WEB-INF/some/path/shiro.ini的形式,或者是其他Shiro的ResourceUtils类支持的形式,如

file:/home/foobar/myapp/shiro.ini
classpath:com/foo/bar/shiro.ini
url:http://confighost.mycompany.com/myapp/shiro.ini

1.2 Web INI 配置

请参考: Apache Shiro学习-1-ini 配置

2. Session 管理

2.1 Servlet 容器 Sessions

Web环境中,Shiro的默认Session管理器SessionManager的实现是 ServletContainerSessionManager.

这个简单默认的实现的好处是采用servlet容器的session配置的应用程序能够正常工作,而缺点是与容器相关的配置不具有通用性,如Jetty和Tomcat的配置不能互用。

Servlet 容器 Session 超时(Timeout)

如果默认的servlet容器支持,这可以在web.xml中配置session超时

<session-config>
  <!-- web.xml expects the session timeout in minutes: -->
  <session-timeout>30</session-timeout>
</session-config>

2.2 本地session(Native Sessions)

如果需要session配置能够跨servlet容器使用(如开发时使用Jetty,而生产环境使用Tomcat),或者需要控制特定的session/集群 (session/clustering features)特征,可以启用Shiro的本地session管理。

此处的“本地”(Native)意味着Shiro的企业级Session管理实现完全绕过了容器被用于支持所有的SubjectHttpServletRequest session。但Shiro的session管理实现时透明的,已存在的 web/http 相关代码照样能够正常工作。

2.2.1 DefaultWebSessionManager

要启用本地session管理器,需要进行配置以便覆盖默认的基于容器的session管理。通过在 SecurityManager 中配置一个 DefaultWebSessionManager 实例可以达到此目的。

[main]
...
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
# configure properties (like session timeout) here if desired # Use the configured native session manager:
securityManager.sessionManager = $sessionManager
Native Session Timeout

声明sessionManager之后,就可以依据Shiro Session Management中的选项配置session管理器,如timeout等

[main]
...
# 3,600,000 milliseconds = 1 hour
securityManager.sessionManager.globalSessionTimeout = 3600000
Session Cookie

DefaultWebSessionManager 支持两个web相关的配置属性

- sessionIdCookieEnabled (布尔值)

- sessionIdCookie (Cookie实例)

sessionIdCookie本质上是一个模板——设置的Cookie实例属性,会被用来在运行时用合适的session id 值设置真正的 http cookie头

Session Cookie 配置

 DefaultWebSessionManager的默认 sessionIdCookie 实例是SimpleCookie。这个简单实现容许采用JavaBean样式来对相关的http Cookie属性进行配置。

 如设置cookie域(domain)(更多设置参考SimpleCookie的javadoc

 [main]
securityManager.sessionManager.sessionIdCookie.domain = foo.com

与servlet规范一样,cookie的默认名称是 JSESSIONID。此外,Shiro的cookie支持 HttpOnly标记(flag)。为了额外的安全考虑,sessionIdCookie 默认设置 HttpOnly 为 true.

取消 Session Cookie

[main]
securityManager.sessionManager.sessionIdCookieEnabled = false

3. Remember Me 服务

如果 AuthenticationToken 实现了org.apache.shiro.authc.RememberMeAuthenticationToken接口,Shiro将支持rememberMe服务

接口中有一个boolean isRememberMe();方法,如果返回true,Shiro将会通过session记住终端用户的身份。

UsernamePasswordToken 实现了 RememberMeAuthenticationToken,支持 RememberMe 服务。

3.1 代码支持

在代码中使用 RememberMe, 可以在支持此配置的类中设置其值为 true。如标准的 UsernamePasswordToken:

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

3.2 表单登录

在web应用中, authc 过滤器默认是 FormAuthenticationFilter。这支持读取'rememberMe' 的布尔值作为表单请求的参数。默认情况下,请求参数的 name 为 rememberMe。如:

[main]
authc.loginUrl = /login.jsp
[urls]
# your login form page here:
login.jsp = authc

登录表单,其中有一个 checkbox 的 name 为'rememberMe':

<form ...>
   Username: <input type="text" name="username"/> <br/>
   Password: <input type="password" name="password"/>
   <input type="checkbox" name="rememberMe" value="true"/>Remember Me?
</form>

默认情况下, FormAuthenticationFilter 将查找 name 为 usernamepassword 和 rememberMe 的请求参数. 如果不是默认的name值,那么需要配置FormAuthenticationFilter. 如在 shiro.ini中:

[main]
authc.loginUrl = /whatever.jsp
authc.usernameParam = somethingOtherThanUsername
authc.passwordParam = somethingOtherThanPassword
authc.rememberMeParam = somethingOtherThanRememberMe

3.3 Cookie 配置

通过设置默认的 RememberMeManager 的各个 cookie 属性可以配置 rememberMe cookie 如何起作用 . 如在shiro.ini中:

[main]
securityManager.rememberMeManager.cookie.name = foo
securityManager.rememberMeManager.cookie.maxAge = blah

更多设置参考CookieRememberMeManagerSimpleCookie的javadoc

4 JSP/GSP 标签库

Shiro提供了基于当前Subject状态的 JSP/GSP 标签库。

4.1 标签库配置

Tag Library Descriptor (TLD) 是位于 shiro-web.jar 中 META-INF 下的 shiro.tld 文件。使用时,在jsp文件顶部添加:

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

guest标签:当当前用户(subject)是访客(guest,没有身份 identity 的用户)时展现其包含的内容(与 user 相反)

<shiro:guest>
    Hi there!  Please <a href="login.jsp">Login</a> or <a href="signup.jsp">Signup</a> today!
</shiro:guest>

user标签:当当前用户(subject)具有identity(通过认证或rememberMe服务)时展现其包含的内容

<shiro:user>
    Welcome back John!  Not John? Click <a href="login.jsp">here<a> to login.
</shiro:user>

authenticated标签:当当前用户(subject)具有identity(在当前session通过认证,不包括通过 rememberMe 服务进入的用户)时展现其包含的内容(与notAuthenticated 标签相反)(在线支付场景)

principal标签:输出subject的身份信息(如用户名)

    Hello, <shiro:principal/>将展现用户名字符串,对应 Hello, <%= SecurityUtils.getSubject().getPrincipal().toString() %>

Typed principal:principal 标签默认输出subject.getPrincipal() 的值。但如果要输出其他值,则可以通过其类型来获取:

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

Principal 属性:如果principal 是一个复杂的对象而非简单的字符串,则可以通过 property 属性名或获取:

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

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

hasRole标签:若当前的Subject具有某种角色,hasRole标签将展现其包含的内容. 对应lacksRole标签.

<shiro:hasRole name="administrator">
    <a href="admin.jsp">Administer the system</a>
</shiro:hasRole>

hasAnyRole标签:任意指定的角色

<shiro:hasAnyRoles name="developer, project manager, administrator">
    You are either a developer, project manager, or administrator.
</shiro:lacksRole>

hasPermission标签:权限,对应lacksPermission

<shiro:hasPermission name="user:create">
    <a href="createUser.jsp">Create a new User</a>
</shiro:hasPermission>

Apache Shiro学习-2-Apache Shiro Web Support的更多相关文章

  1. 【Shiro学习之一】Shiro入门

    一.Shiro Apache Shiro是一个Java安全框架. 1.官网:http://shiro.apache.org/ 2.三个核心组件 Subject:即“当前操作用户”,可以指人.第三方进程 ...

  2. Shiro学习笔记四(Shiro集成WEB)

    这两天由于家里出了点事情,没有准时的进行学习.今天补上之前的笔记 -----没有学不会的技术,只有不停找借口的人 学习到的知识点: 1.Shiro 集成WEB 2.基于角色的权限控制 3.基于权限的控 ...

  3. Shiro学习笔记五(Shiro标签,及通配符)

    1.首先是导入标签库 <%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> ...

  4. 【Shiro学习之六】shiro编码/加密

    apahce shiro:1.6.0 密码存储,应该加密/生成密码摘要存储,而不是存储明文密码. 1.编码/解码Shiro 提供了 base64和 16进制字符串编码/解码的API支持, 方便一些编码 ...

  5. apache shiro学习笔记

    一.权限概述 1.1 认证与授权 认证:系统提供的用于识别用户身份的功能,通常登录功能就是认证功能-----让系统知道你是谁?? 授权:系统授予用户可以访问哪些功能的许可(证书)----让系统知道你能 ...

  6. Shiro学习总结(1)——Apache Shiro简介

    1.1  简介 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比springSecurity,可能没有Spring Securit ...

  7. Apache shiro学习总结

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  8. Java安全框架 Apache Shiro学习-1-ini 配置

    简单登录流程: 1.  SecurityManager   2.  SecurityUtils.setSecurityManager 3.  SecurityUtils.getSubject     ...

  9. Apache Shiro:【1】Shiro基础及Web集成

    Apache Shiro:[1]Shiro基础及Web集成 Apache Shiro是什么 Apache Shiro是一个强大且易于使用的Java安全框架,提供了认证.授权.加密.会话管理,与spri ...

随机推荐

  1. javascript中new Date()会存在偏差一小时的bug

    事件回顾: 因为我们的产品会有与时间转换这部分,并且流量主要集中在小程序. emmm~  获取用户出生的年/月/日/时  我们和后台协商的是换算用户选择后的时间为  年/月/日/时/分/秒  所以我们 ...

  2. js固定表头的实现(转)

    原文链接:http://www.th7.cn/web/js/201509/121055.shtml 参考链接:http://www.jb51.net/article/102568.htm 写两个表格, ...

  3. 通过Ftp put命令上传导致文件损坏的解决办法

    通过Linux命令行向在一台Windows FTP服务器上传文件.然后在另一台Windows客户机登录FTP服务器下载,但是下载后的文件大小变了,exe文件错误了不能正确执行.刻意打包的文件(.rar ...

  4. Wordpress 加载 js 文件到底部

    wp_enqueue_script wp_enqueue_script( string $handle, string $src = '', array $deps = array(), string ...

  5. Centos7环境下安装python3.6.4 并与python2共存

    最近安装了新系统centos7,本身自带python2.7,但是由于需要使用python3 来运行一些应用,所以想到在centos环境下安装python3,并保证其和python2 可以共存. 步骤如 ...

  6. I.MX6 CAAM

    /********************************************************************************* * I.MX6 CAAM * 说明 ...

  7. 用 Python 快速实现 HTTP 和 FTP 服务器

      用 Python 快速实现 HTTP 服务器 有时你需临时搭建一个简单的 Web Server,但你又不想去安装 Apache.Nginx 等这类功能较复杂的 HTTP 服务程序时.这时可以使用  ...

  8. java编程之常见的排序算法

    java常见的排序算法 第一种:插入排序 直接插入排序 1, 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的 ...

  9. office web app server 文件预览部署&& wopi 集成使用

    对于需要进行office 套件文档预览的时候大部分大家使用的是插件,或者类似的,解决方案,微软已经为我们提供了比较好的解决 方案 office web app server (目前名称是office ...

  10. 使用_beginThreadex创建多线程(C语言版多线程)

    _beginThreadex创建多线程解读 一.需要的头文件支持 #include <process.h>         // for _beginthread() 需要的设置:Proj ...