权限系统普遍通性,以shrio为例

来源:互联网 发布:mac netbeans tomcat 编辑:程序博客网 时间:2024/05/16 06:31

在做权限的时候要注意

(一),显示控制,

文件夹,页面根据用户登录是的权限渲染(登录时即可,看怎么整合)

另一方面:页面---权限控制访问 ,

按钮 所有的controller继承一个抽抽象的父的controller,这里每次都查出用户的按钮权限,页面用EL标签判断 决定是否显示出来,同时权限控制(防止直接点击连接)

显示控制(文件夹到按钮) 抽象父类用一个方法查询当前角色,菜单的按钮,跳转到list的时候调用,至于页面文件夹的显示只要在登录成功的时候查出set即可

(二),访问控制(页面,按钮),权限配置

 

请求---url受控---获取是否要求登录,要求角色,要求权限,后面进入校验的时候就不带url了,之后用带有的要求去调用相应的方法

比如,认证,授权(这里也是直接匹配带过来的角色权限要求)

1,用户验证

2,组织用户的角色,权限

3,配置系统所有用户角色权限(这里的就是受保护的)

4,shrio自动两个匹配放行

5, 访问一个资源,先检是否受控(3)(只要受控那么他需要的role,permission就自动根据3带到后面),如果受控再通过1,然后2,到了4的时候会把2和这个访问url带过来的

role,permission匹配决定是否放行,security也是如此,url不在系统初始化的权限列表中如(3),就不会受到权限系统的拦截

即只有访问的资源在3中shrio才会拦截,每拦截一次都会重新加载当前用户的角色,再去对比

登录登出

组装好token,info,之后再验证

 

授权

 

AuthorizingRealm

getAuthorizationInfo

 

在每次访问的时候shrio过滤器会自动执行,1,

5, 访问一个资源,先检是否受控(3)(只要受控那么他需要的role,permission就自动根据3带到后面),如果受控再通过1,然后2,到了4的时候会把2和这个访问url带过来的

role,permission匹配决定是否放行,security也是如此

 

启动的时候当然要加载全部的url,角色信息

 authc,roles,perms(分别对应1,及2中的addROle,addPermiss())表示需要通过这些检验

simpleAuthorInfo.addRole("admin");// 添加一个角色,证明该用户拥有admin角色  相当于roles[admin]----roles默认的过滤器

simpleAuthorInfo.addStringPermission("admin:manage");// 添加权限   相当于  perms[admin:manage],":"表示哪个权限下的----perms默认的过滤器

simpleAuthorInfo.addRoles(roleList);// 给当前用户设置角色  相当于 roles[,,,,]

simpleAuthorInfo.addStringPermissions(permissionList);// 给当前用户设置权限 oper                                                                           

用任何权限框架

1,用他自带的提交url(form)---此时只要登录的表单的字段名和规范一致就可框架自动获取对比

2,用自己的提交url(form),那么里面用到权限框架的部分需要在这个登陆方法里传入了参数

3,用框架需要自定义的时候可以参照已有的写比如:RolesAuthorizationFilter//这个是roles[,,]中所有参数符合才放行,我们如果需要只要符合一个就放行可以重写一个

实现如下 http://blog.csdn.net/ikaraide/article/details/37928389

需要注意的是shrio的资源是url,因为在请求的时候shrio就是拿这个请求的url和我们初次加载的资源map比对(这个url是剔除参数的,所以除了edit(增加,修改)的url都要不同名称,一般会不同

,因为有模块名和操作名(比如Springmvc风格的路劲))

在访问上页面个按钮都当着同等级别的资源,直接由角色控制能不能访问,因为我们用户有了角色之后就有了页面,按钮的访问信息

perms是在角色下,更细小的控制

 

注意:

1,登出调用框架登出的方法(清除信息,不可公用登录的方法)

2,登录页面只会检验authc,后面加其他的(角色,权限)也没用,不会执行

3,自己要做过滤器比如,只要满足一个角色即可访问的,参照系统的RolesAuthorizationFilter(系统默认用的是这个,要所有角色参数满足才可访问)

 4, 整个资源--权限列表的重加载问题(为了修改后不必重启,这里只要看源码中如何调用这个方法即可)

 

shrio动态更行权限

 

http://zgzty.blog.163.com/blog/static/83831226201361134047834/

<!-- 读取自定义权限内容-->

       <propertyname="filterChainDefinitions"value="#{authService.loadFilterChainDefinitions()}"/>   这种是按照原始的文本格式

http://blog.csdn.net/eggtk/article/details/38255871

http://blog.csdn.net/z971829916/article/details/22572587  这种是按照map的方式组织

 

动态创建filterchaindefinitions,这个好

可能会用到的格式化文本技巧:

 public static final String PREMISSION_STRING="perms[\"{0}\"]";

 String q=MessageFormat.format(PREMISSION_STRING, "q");

 perms["q"]

 

AuthenticationRealm只要配置了shrio就是走这个

至于是不是正的拦击,看这个资源没有没有要求AuthenticationFilter看这个url资源没有配置

/admin/** = anon不必登录

 

                /main**=authc  登录成功才可

                /ui/info**=authc  

                /ui/listUser**=authc,perms[admin:manage]  登录成功才可,而且符合perms这个拦截器的admin角色

上面有一条匹配则不往下

<property name="filters">

<map>

<entry key="authc" value-ref="authenticationFilter" /> 

</map>

</property>

//权限规则

http://www.cppblog.com/guojingjia2006/archive/2014/05/14/206956.html这里是配置权限规则和默认的过滤器

比如perms就是默认过滤器

FormAuthenticationFilter authc也是默认的过滤器可以重写,传递项目特有的参数

 

@see 4)举几个例子

 

* @see   /admin=authc,roles[admin](角色)      表示用户必需已通过认证,并拥有admin角色才可以正常发起'/admin'请求

 

* @see   /edit=authc,perms[admin:edit](权限)  表示用户必需已通过认证,并拥有admin:edit权限才可以正常发起'/edit'请求

 

* @see   /home=user                     表示用户不一定需要已经通过认证,只需要曾经被Shiro记住过登录状态就可以正常发起'/home'请求

 

@see   /admins/user/**=ssl         无参,表示安全的URL请求,协议为https////////////////shrio和security比他可以指定哪些需要http,哪些需要https,类似的还可以指定端口

* @see       参数可写多个,多个时必须加上引号,且参数之间用逗号分割,如/admins/user/**=roles["admin,guest"]m 

 

* @see       当有多个参数时必须每个参数都通过才算通过,相当于hasAllRoles()方法

 

* @see       参数可写多个,多参时必须加上引号,且参数之间用逗号分割,如/admins/user/**=perms["user:add:*,user:modify:*"]

 

* @see       当有多个参数时必须每个参数都通过才算通过,相当于isPermitedAll()方法

2. 使用shiro提供的logout filter,///////////////////////////其他的过滤器不必申明,就是这个默认的过滤器需要声明

需要定义 相应的bean

<bean id="logout" class="org.apache.shiro.web.filter.authc.LogoutFilter">

        <property name="redirectUrl" value="/loginform" />

    </bean>

 

    然后将相应的url filter配置为logout如下

<property name="filterChainDefinitions">

            <value>

                # some example chain definitions:

                /index.htm = anon

                /logout = logout

                /unauthed = anon

                /console/** = anon

                /css/** = anon

                /js/** = anon

                /lib/** = anon

                /admin/** = authc, roles[admin]

                /docs/** = authc, perms[document:read]

                /** = authc

                # more URL-to-FilterChain definitions here

            </value>

 

0 0
原创粉丝点击