设为首页 收藏本站
查看: 1016|回复: 0

[经验分享] Apache Shiro Web Support学习笔记

[复制链接]

尚未签到

发表于 2015-11-14 09:15:14 | 显示全部楼层 |阅读模式
  Web项目中集成Shrio(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>
  shiro.ini存放位置:
  1./WEB-INF/shiro.ini;
  2.存放在classpath的根目录中(classpath:shiro.ini)。
  配置文档功能介绍:
  1.EnvironmentLoaderListener的功能是创建IniWebEnvironment实例初始化Shiro的运行环境,获取shiro.ini信息。如果需要自定义初始化,可以使用WebUtils.getRequiredWebEnvironment(servletContext)来进行环境初始化。
  2.ShiroFilter将对初始化后的web应用执行过滤操作。
  3.filter-mapping设定过滤规则。
  (一般情况下,需要将Shiro的filter-mapping定义在最前面,以保证过滤器可以率先执行全局过滤。)
  自定义配置文件加载所需配置(舍弃EnvironmentLoaderListener的初始化。web.xml):

<context-param>
<param-name>shiroEnvironmentClass</param-name>
<param-value>com.foo.bar.shiro.MyWebEnvironment</param-value>
</context-param>
  自定义的初始化工具类可以加载xml等不同的配置文件。


  


  一、配置文件的路径设置(使用Resource.Utils定义的资源路径前缀)
  1.2及以后版本中可以如此定义:
  1./WEB-INF/shiro.ini;
  2.存放在classpath的根目录中(classpath:shiro.ini)。
  在早期版本中必须如此定义:
  1.文件系统式:file:/home/foobar/myapp/shiro.ini;
  2.相对路径式:classpath:com/foo/bar/shiro.ini;
  3.URL式:url:http://confighost.mycompany.com/myapp/shiro.ini。
  二、可以在web.xml中直接写shiro.ini的内容:

<filter>
<filter-name>ShiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
<init-param><param-name>config</param-name><param-value>
# INI Config Here    //将ini文件中的配置全部写在这里
</param-value></init-param>
</filter>
...
  一般会将shiro的配置独立写在另外的文件:
  1.shiro的配置很多,与web.xml中的配置写在一块显得很乱,且不美观;
  2.shiro配置需要和web.xml分割开,需要一定独立性;
  3.保证web.xml的易读性;
  4.保持shiro配置的可重用性。
  


  Web集成Shiro的早期配置方法(web.xml):

<filter>
<filter-name>ShiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
</filter>
...
<!-- Make sure any request you want accessible to Shiro is filtered. /* catches all -->
<!-- requests.  Usually this filter mapping is defined first (before all others) to -->
<!-- ensure that Shiro works in subsequent filters in the filter chain:             -->
<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文件既不在classpath根目录,也不在Web-INF下,则需要为其设定路径:

<filter>
<filter-name>ShiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
<init-param>
<param-name>configPath</param-name>
<param-value>/WEB-INF/anotherFile.ini</param-value>
</init-param>
</filter>
...
  


  shiro.ini中urls块的配置:

...
[urls]
/index.html = anon
/user/create = anon
/user/** = authc
/admin/** = authc, roles[administrator]
/rest/** = authc, rest
/remoting/rpc/** = authc, perms[&quot;remote:invoke&quot;]
  等号左边是需要过滤的对象,右边是过滤所执行的过滤器的名字,过滤器的名字在 main区域中会有定义。如果过滤器需要特殊定义,可以写成filterName[filterUrlPath-过滤器路径]。
  过滤器会按照所写的顺序执行。
  案例一:

/account/** = ssl, authc
  含义:任何通过/account路径,或者其拓展路径/account/foo,/account/bar/baz的行为都会触发ssl、authc过滤器的过滤启动。
  案例二:

/account/** = ssl, authc
/account/signup = anon
  第二行配置永远执行不了,因为第一行的过滤器已经将符合第二行规则的用户全部过虑掉了(以为这些用户不符合第一行规则)。所以,设定过滤器的顺序很重要。
  


  如果需要实现自定义filter,需要继承org.apache.shiro.web.filter.PathMatchingFilter类。并且在main区域加以配置:

[main]
...
myFilter = com.company.web.some.FilterImplementation
myFilter.property1 = value1
...
[urls]
...
/some/path/** = myFilter
  


  Shiro自带多个filter:

[main]
...
# Notice how we didn't define the class for the FormAuthenticationFilter ('authc') - it is instantiated and available already:
authc.loginUrl = /login.jsp    //我们并没有在main区域定义名字为‘authc’的filter,但是shiro本身已经定义了,所以可以直接引用。
...
[urls]
...
# make sure the end-user is authenticated.  If not, redirect to the 'authc.loginUrl' above,
# and after successful authentication, redirect them back to the original account page they
# were trying to view:
/account/** = authc
...
  已经存在的默认filter:

anon
org.apache.shiro.web.filter.authc.AnonymousFilter
authc
org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasic
org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
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  


  在Shiro1.2之前如果需要使filter失效,需要将其从配置文件中删除或注释,现在只需添加其状态为不可用即可。

[main]
...
# configure Shiro's default 'ssl' filter to be disabled while testing:
ssl.enabled = false
[urls]
...
/some/path = ssl, authc
/another/path = ssl, roles[admin]
...
  实质上,OncePerRequestFilter通过它的isEnabled(request, response)方法来控制某一个filter的启用或停用,可以根据需要重写。它的子类PathMatchingFilter则可以控制路径匹配的过滤,可以根据需要重写。


  


  ServletContainerSessionManager是SessionManager的子类,它可以实现Shiro的session与servlet的session之间的互通与共享。
  优点:session拥有共同的配置属性。
  缺点:配置属性具有不可移植性。
  如果想要对Shiro的session做特殊的配置,则需要启用Shiro的自己的sessionManager机制来代替servlet的session管理机制接管应用中所有的session(shiro.ini)。

[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

  另外,Shiro的本地sessionManager可以设定cookie
  1.sessionIdCookieEnabled (a boolean)  设定cookie的可用
  2.sessionIdCookie    初始化cookie实例
  创建cookie模板(shiro.ini):

[main]
...
securityManager.sessionManager.sessionIdCookie.domain = foo.com
  禁用cookie(shiro.ini):

[main]
...
securityManager.sessionManager.sessionIdCookieEnabled = false
  


  记住我功能实现:
  java:

UsernamePasswordToken token = new UsernamePasswordToken(username, password);
token.setRememberMe(true);
SecurityUtils.getSubject().login(token);
...
  shiro.ini:

[main]
authc.loginUrl = /login.jsp
[urls]
# your login form page here:
login.jsp = authc
  jsp:

<form ...>
Username: <input type=&quot;text&quot; name=&quot;username&quot;/> <br/>
Password: <input type=&quot;password&quot; name=&quot;password&quot;/>
...
<input type=&quot;checkbox&quot; name=&quot;rememberMe&quot; value=&quot;true&quot;/>Remember Me?
...
</form>
  其中这三个参数名字是shiro限定的,如果要改变,需要在shiro.ini中进行配置:

[main]
...
authc.loginUrl = /whatever.jsp
authc.usernameParam = somethingOtherThanUsername
authc.passwordParam = somethingOtherThanPassword
authc.rememberMeParam = somethingOtherThanRememberMe
...
  设置记住我的cookie(shiro.ini):

[main]
...
securityManager.rememberMeManager.cookie.name = foo
securityManager.rememberMeManager.cookie.maxAge = blah
...
  当然记住我功能是可以定制的(shiro.ini):



[main]
...
rememberMeManager = com.my.impl.RememberMeManager
securityManager.rememberMeManager = $rememberMeManager
  


  JSP引用Shiro

<%@ taglib prefix=&quot;shiro&quot; uri=&quot;http://shiro.apache.org/tags&quot; %>
  案例一(游客登录):

<shiro:guest>
Hi there!  Please <a href=&quot;login.jsp&quot;>Login</a> or <a href=&quot;signup.jsp&quot;>Signup</a> today!
</shiro:guest>
  案例二(用户登录):

<shiro:user>
Welcome back John!  Not John? Click <a href=&quot;login.jsp&quot;>here<a> to login.
</shiro:user>
  案例三(验证用户登录):



<shiro:authenticated>
<a href=&quot;updateAccount.jsp&quot;>Update your contact information</a>.
</shiro:authenticated>
  案例四(未认证用户登录):



<shiro:notAuthenticated>
Please <a href=&quot;login.jsp&quot;>login</a> in order to update your credit card information.
</shiro:notAuthenticated>

  案例五(principal标签输出用户验证信息):

Hello, <shiro:principal/>, how are you today?
  等同于

Hello, <%= SecurityUtils.getSubject().getPrincipal().toString() %>, how are you today?
  案例六(principal从验证属性中取出类型匹配的属性):

User ID: <principal type=&quot;java.lang.Integer&quot;/>
  等同于

User ID: <%= SecurityUtils.getSubject().getPrincipals().oneByType(Integer.class).toString() %>
  案例七(直接通过属性名来取&#20540;):

Hello, <shiro:principal property=&quot;firstName&quot;/>, how are you today?
  等同于

Hello, <%= SecurityUtils.getSubject().getPrincipal().getFirstName().toString() %>, how are you today?
  或者

Hello, <shiro:principal type=&quot;com.foo.User&quot; property=&quot;firstName&quot;/>, how are you today?
  或者

Hello, <%= SecurityUtils.getSubject().getPrincipals().oneByType(com.foo.User.class).getFirstName().toString() %>, how are you today?
  案例八(指定特定角色):

<shiro:hasRole name=&quot;administrator&quot;>
<a href=&quot;admin.jsp&quot;>Administer the system</a>
</shiro:hasRole>
  案例九(去除特定角色):

<shiro:lacksRole name=&quot;administrator&quot;>
Sorry, you are not allowed to administer the system.
</shiro:lacksRole>
  案例十(拥有角色集中的某一个):

<shiro:hasAnyRoles name=&quot;developer, project manager, administrator&quot;>
You are either a developer, project manager, or administrator.
</shiro:lacksRole>
  案例十一(拥有特定权限):

<shiro:hasPermission name=&quot;user:create&quot;>
<a href=&quot;createUser.jsp&quot;>Create a new User</a>
</shiro:hasPermission>
  案例十二(去除特定权限者):

<shiro:hasPermission name=&quot;user:create&quot;>
<a href=&quot;createUser.jsp&quot;>Create a new User</a>
</shiro:hasPermission>
  &#65279;&#65279;

&#65279;&#65279;

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-139013-1-1.html 上篇帖子: 在Linux(Fedora 16)上配置Tomcat 7.0.x 和Apache Http Server 2.2.x 集成 下篇帖子: Apache Shiro(安全框架)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表