Apache Shiro学习-2-Apache Shiro Web Support
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管理实现完全绕过了容器被用于支持所有的Subject和HttpServletRequest 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 为 username, password 和 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
更多设置参考CookieRememberMeManager和SimpleCookie的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的更多相关文章
- 【Shiro学习之一】Shiro入门
一.Shiro Apache Shiro是一个Java安全框架. 1.官网:http://shiro.apache.org/ 2.三个核心组件 Subject:即“当前操作用户”,可以指人.第三方进程 ...
- Shiro学习笔记四(Shiro集成WEB)
这两天由于家里出了点事情,没有准时的进行学习.今天补上之前的笔记 -----没有学不会的技术,只有不停找借口的人 学习到的知识点: 1.Shiro 集成WEB 2.基于角色的权限控制 3.基于权限的控 ...
- Shiro学习笔记五(Shiro标签,及通配符)
1.首先是导入标签库 <%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> ...
- 【Shiro学习之六】shiro编码/加密
apahce shiro:1.6.0 密码存储,应该加密/生成密码摘要存储,而不是存储明文密码. 1.编码/解码Shiro 提供了 base64和 16进制字符串编码/解码的API支持, 方便一些编码 ...
- apache shiro学习笔记
一.权限概述 1.1 认证与授权 认证:系统提供的用于识别用户身份的功能,通常登录功能就是认证功能-----让系统知道你是谁?? 授权:系统授予用户可以访问哪些功能的许可(证书)----让系统知道你能 ...
- Shiro学习总结(1)——Apache Shiro简介
1.1 简介 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比springSecurity,可能没有Spring Securit ...
- Apache shiro学习总结
Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...
- Java安全框架 Apache Shiro学习-1-ini 配置
简单登录流程: 1. SecurityManager 2. SecurityUtils.setSecurityManager 3. SecurityUtils.getSubject ...
- Apache Shiro:【1】Shiro基础及Web集成
Apache Shiro:[1]Shiro基础及Web集成 Apache Shiro是什么 Apache Shiro是一个强大且易于使用的Java安全框架,提供了认证.授权.加密.会话管理,与spri ...
随机推荐
- linux自建git仓库
一 安装git,设置git用户(当前操作是root用户) 1.安装git yum install git 2.创建git用户 groupadd git useradd git -g git 3.创建证 ...
- jquery+html5制作超酷的圆盘时钟表
自己封装的一个用HTML5+jQuery写的时钟表 代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...
- 『转』G Data InternetSecurity 2014 – 免费3个月
G Data来自德国的顶级杀毒软件,采用BitDefender+CloseGap双引擎,屡获AV-TEST防護率100%.不多介绍,目前2014中文版没有上市.活动地址:点此进入官方网站:点此进入申请 ...
- w3m使用小记
By francis_hao Mar 8,2017 w3m是一个基于文本的web浏览器和分页器,运行在unix和windows系统上. 可显示包含链接的超文本标记语言(HTML),显示效果如 ...
- python中多线程
多线程 什么是多线程 开启线程的两种方式 进程和线程的区别 Thread对象的其他属性和方法 守护线程 死锁现象与递归锁 信号量.Event定时器 线程Queue 进程池和线程池 什么是多线程 在传统 ...
- tensorflow中tensor的静态维度和动态维度
tf中使用张量(tensor)这种数据结构来表示所有的数据,可以把张量看成是一个具有n个维度的数组或列表,张量会在各个节点之间流动,参与计算. 张量具有静态维度和动态维度. 在图构建过程中定义的张量拥 ...
- 伴随我整十个年头的校内网,现名 人人网, 是不是要shut down 了
如题: 每天我都习惯性的登录人人网,虽然现在基本上已经看不到曾经的同学上线了,不过我还是有事没事的往上面post 一些出行的照片,没事无聊的时候上这个网上看看自己曾经的照片,虽然已经无人在线,但是自己 ...
- python的继承顺序
python的继承顺序 python 创建类时分为新式类和旧式类 class A: # 经典类 def __init__(self): pass # 新类,可以在这里加 __metaclass__ = ...
- Oracle-SQL高级查询
--一个题目涉及到的50个Sql语句 --(下面表的结构以给出,自己在数据库中建立表.并且添加相应的数据,数据要全面些. 其中Student表中,SId为学生的ID) ---------------- ...
- 用Navicat复制数据库到本地(导入.sql文件运行)
今天装数据库的机子没开,项目运行不了,于是还是决定在自己电脑上装数据库,由于新学数据库操作,记录一下 一.转储sql文件 右键点击数据库,转储sql文件,点击结构和数据 存放在本地,开始转储 转储完成 ...