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. IOS-网络(文件上传)

    // // ViewController.m // IOS_0206_文件上传 // // Created by ma c on 16/2/6. // Copyright © 2016年 博文科技. ...

  2. Ubuntu下XTerm乱码问题的解决及XTerm的简单配置

    本人比较喜欢Ubuntu这个Linux的发行版,主要是安装程序插件什么的都比较方便,推荐新手使用,可以免去很多麻烦的配置,将注意力放在编程的学习上,当然如果是想专门学Linux的,还是推荐在Cento ...

  3. SPOJ VLATTICE Visible Lattice Points 莫比乌斯反演 难度:3

    http://www.spoj.com/problems/VLATTICE/ 明显,当gcd(x,y,z)=k,k!=1时,(x,y,z)被(x/k,y/k,z/k)遮挡,所以这道题要求的是gcd(x ...

  4. Lucene Scoring 评分机制

    原文出处:http://blog.chenlb.com/2009/08/lucene-scoring-architecture.html Lucene 评分体系/机制(lucene scoring)是 ...

  5. zTree简单使用

    zTree使用 zTree github地址 zTree API文档 zTree插件依赖JQ所以使用zTree首先引入JQ,另外zTree的点击功能,编辑功能都是单独的文件,如需使用也要引入(也可以引 ...

  6. 监听器的使用例子 ServletContextListener

    之前一直对监听知识有个概念,最近业务需要用到了才真正有点了解了监听器的好处. web项目的监听事件与监听器: ServletAPI中的6个事件类: ServletContextEvent:该类表示上下 ...

  7. 『转』三星推出Android智能手表Galaxy Gear

    苹果定下来本月10日召开新品发布会,而它的竞争对手三星却抢先一步.今天凌晨,三星在德国柏林一口气发布了三款重量级产品.三星智能手表Galaxy Gear最引人关注,其将于9月25日陆续在全球上市,售价 ...

  8. PostgreSQL锁级别及什么操作获取什么锁

    表级锁 大多数的表级锁是由内置的 SQL 命令获得的,但他们也可以通过锁命令来明确获取.可使用的表级锁包括: 访问共享(ACCESS SHARE) - SELECT 命令可在查询中引用的表上获得该锁. ...

  9. Javascript中的prototype与继承

    通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性列表.javascript创建对象时采用了写时复制的理念. 只有构造器才具有prototype属性,原型链继承 ...

  10. idea 使用spring boot 搭建freemarker模板

      一丶新建maven spring boot 项目 新建好了开始使用模板 先看一个目录结构 二丶配置pox.xml <?xml version="1.0" encoding ...