快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡亰平台官网址_龟发之家论坛



上一篇阐清澳门新葡亰平台官网址楚明了security 是若何加载资本和权限列表的,本日这篇差不多该停止了,开始阐明当用户哀求一个url的时刻,security是若何根据你的登岸用户 和资本权限列表去决策你是否有权限造访你的url的。

首先你登岸完成之后,security会记录你的用户名以及其他一些信息,此中包括你所具有的权限,当你造访一个url的时刻,security会根据你的url地址找到造访它所必要的权限列表,然落后行决策。

若何构建你自定义的决策类?

新建一个类实现AccessDecisionManager接口,应该是这个样子:

package cn.com.xinma.frame.service;

import java.util.Collection;

import org.springframework.security.access.AccessDecisionManager;

import org.springframework.security.access.AccessDeniedException;import org.springf澳门新葡亰平台官网址ramework.security.access.ConfigAttribute;

import org.springframework.security.authentication.InsufficientAuthenticationException;import org.springframework.security.core.Authentication;

import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;

public class aaa implements AccessDecisionManager {

@Overridepublic void decide(Authentication arg0, Object arg1,

Collection arg2) throws AccessDeniedException,InsufficientAuthenticationException {

// TODO Auto-generated method stub

}

@Overridepublic boolean supports(ConfigAttribute arg0) {

// TODO Auto-generated method stubreturn false;

}

@Overridepublic澳门新葡亰平台官网址 boolean supports(Class arg0) {

// TODO Auto-generated method stubreturn false;

}

}

此中两个重写的suppots措施都把返回值改为true

最紧张的便是decide措施 ,它认真去决策你是否有权限去造访你造访的资本。

这个措施的第一个参数Authentication 是你登岸的角色所具有的权限列表。

第二个参数是你造访的url。

第三个参数是造访这个url所必要的权限列表。

至于security是如何获取这些信息的先不管,必要经由过程一些简单的设置设置设备摆设摆设就可以了。是框架自己实现的,我们不必要具体懂得。

知道了登岸用户所具有的权限,和造访资本的权限,决策就异常好做了。我给出项目中的源码,仅供参考.

package cn.com.xinma.frame.service;

import java.util.Collection;

import java.util.Iterator;

import org.springframework.security.access.AccessDecisionManager;import org.springframework.security.access.AccessDeniedException;

import org.springframework.security.access.ConfigAttribute;import org.springframework.security.access.SecurityConfig;

import org.springframework.security.authentication.InsufficientAuthenticationException;import org.springframework.security.core.Authentication;

import org.springframework.security.core.GrantedAuthority;import org.springframework.stereotype.Component;

/**

* AccessdecisionManager在Spring security中是很紧张的。*

* 在验证部分大略提过了,所有的Authentication实现必要保存在一个GrantedAuthority工具数组中。 这便是付与给主体的权限。* GrantedAuthority工具经由过程AuthenticationManager 保存到

* Authentication工具里,然后从AccessDecisionMan澳门新葡亰平台官网址ager读出来,进行授权判断。*

* Spring Security供给了一些拦截器,来节制对安然工具的造访权限,例如措施调用或web哀求。* 一个是否容许履行调用的预调用抉择,是由AccessDecisionManager实现的。 这个 AccessDecisionManager

* 被AbstractSecurityInterceptor调用, 它用来作终极造访节制的抉择。* 这个AccessDecisionManager接口包孕三个措施:

** void decide(Authentication authentication, Object secureObject,

* List config) throws AccessDeniedException; boolean* supports(ConfigAttribute attribute); boolean supports(Class clazz);

** 从第一个措施可以看出来,AccessDecisionManager应用措施参数通报所有信息,这似乎在认证评估时进行抉择。

* 分外是,在真实的安然措施期望调用的时刻,通报安然Object启用那些参数。 比如,让我们假设安然工具是一个MethodInvocation。* 很轻易为任何Customer参数查询MethodInvocation,

* 然后在AccessDecisionManager里实现一些有序的安然逻辑,来确认主体是否容许在那个客户上操作。* 假如造访被回绝,实现将抛出一个AccessDeniedException非常。

** 这个 supports(ConfigAttribute) 措施在启动的时刻被

* AbstractSecurityInterceptor调用,来抉择AccessDecisionManager* 是否可以履行通报ConfigAttribute。 supports(Class)措施被安然拦截器实现调用,

* 包孕安然拦截器将显示的AccessDecisionManager支持安然工具的类型。*/

@Component("DecisionManager")public class CustomAccessDecisionManager implements AccessDecisionManager {

public void decide(Authentication authentication, Object object,

Collection configAttributes) throws AccessDeniedException,InsufficientAuthenticationException {

if (configAttributes == null) {return;

}Collection as= authentication.getAuthorities();

Iterator ite = configAttributes.iterator();

while (ite.hasNext()) {

ConfigAttribute ca = ite.next();

String needRole = ((SecurityConfig) ca).getAttribute();System.out.print("URL:"+object+"----needrole:"+needRole);

// ga 为用户所被付与的权限。 needRole 为造访响应的资本应该具有的权限。for (GrantedAuthority ga : as) {

if (needRole.trim().equals(ga.getAuthority().trim())) {

return;

}

}

}

throw new AccessDeniedException("造访回绝");

}

public boolean supports(ConfigAttribute attribute) {

return true;

}

public boolean supports(Class clazz) {return true;

}

}

好了三个部分都说完了,写完了。那要设置设置设备摆设摆设到security 的设置设置设备摆设摆设文件里面,才会起到感化。

这个设置设置设备摆设摆设文件也不多,看了应该很轻易明白,不说清楚明了。我贴出来。

http auto-config="true" lowercase-comparisons="false">

intercept-url pattern="/login.jsp" filters="none" />

form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?error=true" login-processing-url="/j_security_check" />remember-me user-service-ref="UserDetailsService" key="e37f4b31-0c45-11dd-bd0b-0800200c9a66" />

session-management>

concurrency-control max-sessions="1"error-if-maximum-exceeded="true" />

session-management>

custom-filter ref="myFilter" before="FILTER_SECURITY_INTERCEPTOR" />http>

beans:bean id="myFilter" class="cn.com.xinma.frame.service.CustomFilterSecurityInterceptor">

beans:property name="authenticationManager" ref="authenticationManager" />beans:property name="accessDecisionManager" ref="customAccessDecisionManager" />

beans:property name="securityMetadataSource" ref="customSecurityMetadataSource" />beans:bean>

beans:bean id="customSecurityMetadataSource"class="cn.com.xinma.frame.service.CustomInvocationSecurityMetadataSourceService">

beans:bean>

authentication-manager alias="authenticationManager">authentication-provider user-service-ref="UserDetailsService">

password-encoder ref="MyPasswordEncode">

salt-source user-property="username" />password-encoder>

authentication-provider>authentication-manager>

beans:bean id="customAccessDecisionManager"

class="cn.com.xinma.fra澳门新葡亰平台官网址me.service.CustomAccessDecisionManager">beans:bean>

您可能还会对下面的文章感兴趣: