Shiro学习(七)——Shiro与web集成

前言

Shiro作为一个权限认证框架,最主要的服务对象应该就是JavaWeb。因此如何与web集成是发挥shiro作用的关键。这里以最基础的与servlet集成作为例子。

新建简单的servlet应用

这里以《Eclipse新建基于Servlet3.x的maven项目》这篇文章的方式构建基本的servlet,就不在本文叙述了。

Servlet与Shiro集成

在web.xml配置监听器和过滤器

首先在web.xml中添加如下内容:

	<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>

添加一个监听器EnvironmentLoaderListener,这个监听器会默认创建IniWebEnvironment,读取默认位置的shiro.ini文件,然后默认创建DefaultWebSecurityManager。

然后ShiroFilter这个过滤器,替我们实现web登录及权限认证过滤器的功能。可以回想一下,自己写一个登录认证功能,都会写个filter,当用户访问哪些路径时,必须是已登录的,或者必须具备某些权限。现在等于ShiroFilter实现了这个filter的功能,我们只需要配置路径即可。

配置pom.xml

既然要和shiro集成,肯定要增加对shiro的依赖,因为涉及到web方面,还需要增加对shiro-web的依赖

......

		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-core</artifactId>
			<version>1.5.3</version>
		</dependency>
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-web</artifactId>
			<version>1.5.3</version>
		</dependency>

......

配置shiro.ini

下一步是在shiro.ini中配置过滤器对应的路径

[main]
#登录认证的页面
authc.loginUrl=/login
#缺少权限时跳转的页面
roles.unauthorizedUrl=/unauthorized.jsp

[users]
zhang=123,role1
wang=456,role1,role2
li=123
[roles]
role1=user:create,update
role2=user:create,delete

[urls]
#请求login的时候不需要权限,游客身份即可(anon)
/login=anon
/login.jsp=anon

#请求/user/updatePwd.jsp的时候,需要身份认证(authc)
/*=authc

#请求/admin的时候,需要角色认证,必须是拥有admin角色的用户才行
/admin/*.jsp=roles[role2]

配置都不难理解,读者可以自行尝试一下,如果未登陆时直接访问/shiroWeb/hello会怎么样,也可以试下以zhang这个用户访问/admin路径下的页面会怎么样。上面/unauthorized.jsp页面和/admin下的页面,读者可以自行编写,没什么特殊要求。

Shiro提供了以下这些过滤器,我们用了其中的anon、authc和roles。其他的各位也可以自行尝试,如果后面有时间我也会逐个尝试并在文章中展示:

Filter Name Class
anon org.apache.shiro.web.filter.authc.AnonymousFilter
authc org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
authcBearer org.apache.shiro.web.filter.authc.BearerHttpAuthenticationFilter
invalidRequest org.apache.shiro.web.filter.InvalidRequestFilter
logout org.apache.shiro.web.filter.authc.LogoutFilter
noSessionCreation org.apache.shiro.web.filter.session.NoSessionCreationFilter
perms org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
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

Session有效时间

对Web开发有一定了解都知道登录之后,后台会为用户保存一个session,当下次检验是否已登录时,可以根据sessionId进行判断。session是存在有效期的,有效期过了之后就要重新登录了,我们可以在web.xml中配置session有效期,在web.xml中添加这一段:

	<session-config>
		<session-timeout>30</session-timeout>
	</session-config>

这里指session有效期为30分钟。如果想测试一下效果的话,读者可以尝试改成1分钟。这样登录后过了一分钟再次访问shiroWeb/hello看看效果如何。

小结

Shiro与web的集成是开发javaweb应用非常重要的一环。本文的应用方式基本可以满足小型Servlet应用的需要。通常现在的javaweb开发还需要考虑到和spring的集成。另外关于session,Shiro默认使用Servlet的session,不过实际项目开发尤其是分布式应用会把session存放到redis中给分布式系统各主机访问,所以后续还要考虑Shiro和redis的集成。

猜你喜欢

转载自blog.csdn.net/sadoshi/article/details/120564426