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 NameClass
anonorg.apache.shiro.web.filter.authc.AnonymousFilter
authcorg.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasicorg.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
authcBearerorg.apache.shiro.web.filter.authc.BearerHttpAuthenticationFilter
invalidRequestorg.apache.shiro.web.filter.InvalidRequestFilter
logoutorg.apache.shiro.web.filter.authc.LogoutFilter
noSessionCreationorg.apache.shiro.web.filter.session.NoSessionCreationFilter
permsorg.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
portorg.apache.shiro.web.filter.authz.PortFilter
restorg.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
rolesorg.apache.shiro.web.filter.authz.RolesAuthorizationFilter
sslorg.apache.shiro.web.filter.authz.SslFilter
userorg.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的集成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值