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. Python+Flask+MysqL的web建设技术过程

    一.前言(个人学期总结) 个人总结一下这学期对于Python+Flask+MysqL的web建设技术过程的学习体会,Flask小辣椒框架相对于其他框架而言,更加稳定,不会有莫名其妙的错误,容错性强,运 ...

  2. 学习笔记20151211——AXI4 STREAM DATA FIFO

    AXI4 STREAM DATA FIFO是输入输出接口均为AXIS接口的数据缓存器,和其他fifo一样是先进先出形式.可以在跨时钟域的应用中用于数据缓冲,避免亚稳态出现.支持数据的分割和数据拼接.在 ...

  3. Centos系统更改yum源为163

    Centos安装好之后,按照网上教程对yum源进行修改,但更新之后发现总是提示更新失败,到163网站上查找资源发现目前大部分网上的教程都写错地址了,呵呵 下面是正确的办法,请参考 1.进入存放源配置的 ...

  4. 【linux】linux无root权限安装包的一般流程

    apt-get source PACKAGE ./configure --prefix=$HOME/myapps make make install

  5. Mac安装并破解OmniGraffle7

    这个实际上不算破解,只是找到了可用的序列号 1.下载地址 https://www.omnigroup.com/omnigraffle 2.激活方法 Omnigraffle Pro 7注册码/许可证 名 ...

  6. 微信逆向工程之远程操作Mac

    远程控制指令: (功能-指令-是否开启) macbook控制: 屏幕保护-ScreenSave-开启 锁屏-LockScreen-开启 休眠-Sleep-开启 关机-Shutdown-开启 重启-Re ...

  7. lambda,reduce,filter用法

    1.lambda的用法 sum = lambda arg1,arg2:arg1+arg2 sum(10,20) --->30 | | 实际上是def sum(arg1,arg2) return ...

  8. BZOJ4025: 二分图【线段树分治】【带撤销的并查集】

    Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考考你. Input ...

  9. 20145237 Exp9 Web安全基础实践

    基础问题回答 SQL注入攻击原理,如何防御: 部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,黑客利用这个bug在数据输入区恶意填入脚本,当数据被传回后台,黑客所填入的脚本语句被运行, ...

  10. Redis之数据持久化RDB与AOF

    Redis之数据持久化RDB与AOF https://www.cnblogs.com/zackku/p/10087701.html 大家都知道,Redis之所以性能好,读写快,是因为Redis是一个内 ...