Shiro作为一个权限认证框架,最主要的服务对象应该就是JavaWeb。因此如何与web集成是发挥shiro作用的关键。这里以最基础的与servlet集成作为例子。
新建简单的servlet应用这里以《Eclipse新建基于Servlet3.x的maven项目》这篇文章的方式构建基本的servlet,就不在本文叙述了。
Servlet与Shiro集成 在web.xml配置监听器和过滤器首先在web.xml中添加如下内容:
org.apache.shiro.web.env.EnvironmentLoaderListener ShiroFilter org.apache.shiro.web.servlet.ShiroFilter ShiroFilter /* REQUEST FORWARD INCLUDE ERROR
添加一个监听器EnvironmentLoaderListener,这个监听器会默认创建IniWebEnvironment,读取默认位置的shiro.ini文件,然后默认创建DefaultWebSecurityManager。
然后ShiroFilter这个过滤器,替我们实现web登录及权限认证过滤器的功能。可以回想一下,自己写一个登录认证功能,都会写个filter,当用户访问哪些路径时,必须是已登录的,或者必须具备某些权限。现在等于ShiroFilter实现了这个filter的功能,我们只需要配置路径即可。
配置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 |
对Web开发有一定了解都知道登录之后,后台会为用户保存一个session,当下次检验是否已登录时,可以根据sessionId进行判断。session是存在有效期的,有效期过了之后就要重新登录了,我们可以在web.xml中配置session有效期,在web.xml中添加这一段:
30
这里指session有效期为30分钟。如果想测试一下效果的话,读者可以尝试改成1分钟。这样登录后过了一分钟再次访问shiroWeb/hello看看效果如何。
小结Shiro与web的集成是开发javaweb应用非常重要的一环。本文的应用方式基本可以满足小型Servlet应用的需要。通常现在的javaweb开发还需要考虑到和spring的集成。另外关于session,Shiro默认使用Servlet的session,不过实际项目开发尤其是分布式应用会把session存放到redis中给分布式系统各主机访问,所以后续还要考虑Shiro和redis的集成。



