gpt4 book ai didi

java - Spring security @secure 不适用于角色层次结构

转载 作者:行者123 更新时间:2023-11-30 08:29:18 25 4
gpt4 key购买 nike

我在 spring security 中使用角色层次结构,我的 spring-securityConfig.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">

<bean id="roleHierarchy" class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
<property name="hierarchy">
<value>
ROLE_ADMIN > ROLE_WORKFLOW
ROLE_ADMIN > ROLE_ISBN_INSERTION
ROLE_ADMIN > ROLE_PERMISSION_UPDATE
ROLE_ADMIN > ROLE_ASSIGNMENT
ROLE_ADMIN > ROLE_CALIBRATION
</value>
</property>
</bean>

<bean id="expressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler">
<property name="roleHierarchy" ref="roleHierarchy" />
</bean>

<bean id="webExpressionHandler" class="org.springframework.security.web.access.expression.WebExpressionVoter">
<property name="expressionHandler">
<ref bean="expressionHandler" />
</property>
</bean>

<bean id="roleVoter"
class="org.springframework.security.access.vote.RoleHierarchyVoter">
<constructor-arg>
<ref bean ="roleHierarchy"/>
</constructor-arg>
</bean>

<bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
<constructor-arg>
<list>
<ref bean="roleVoter" />
<bean class="org.springframework.security.access.vote.AuthenticatedVoter" />
<ref bean="webExpressionHandler"/>
</list>
</constructor-arg>
</bean>

<bean id="authenticationEntryPoint"
class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
<property name="loginFormUrl" value="/login.htm" />
</bean>





<security:http entry-point-ref="authenticationEntryPoint" disable-url-rewriting="true" access-decision-manager-ref="accessDecisionManager">

<security:session-management>
<security:concurrency-control error-if-maximum-exceeded="true" max-sessions="1"/>
</security:session-management>

<security:custom-filter position="FORM_LOGIN_FILTER"
ref="cdlAuthenticationProcessingFilter" />


<security:intercept-url pattern="/displayGroupRoleEditView.htm" access="ROLE_PERMISSION_UPDATE" />

<security:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY" />

<security:access-denied-handler ref="accessDeniedHandler" />

</security:http>


<security:authentication-manager alias="authenticationManager">
<security:authentication-provider ref="cdlLdapAuthenticationProvider"/>
<security:authentication-provider user-service-ref="cdlUserDetailService"/>
</security:authentication-manager>


<security:authentication-manager alias="authenticationManager">
<security:authentication-provider ref="cdlLdapAuthenticationProvider"/>
<security:authentication-provider user-service-ref="cdlUserDetailService"/>
</security:authentication-manager>

<bean name="commonPropertyBean" class="com.qait.cdl.commons.domain.CommonPropertyBean"
abstract="true">
<property name="userDao" ref="userDao"/>
</bean>

<bean name="commonAuthoritiesPopulator" class="com.qait.cdl.authentication.customfilter.AuthoritiesPopulator" parent ="commonPropertyBean" />

<bean id="cdlLdapAuthenticationProvider" class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
<constructor-arg ref="customLdapBindAuthenticator"/>
<constructor-arg ref="cdlAuthoritiesPopulator"/>
</bean>

<bean id="customLdapBindAuthenticator" class="org.springframework.security.ldap.authentication.BindAuthenticator">
<constructor-arg ref="cdlLdapContextSource" />
<property name="userDnPatterns">
<list>
<value>${ldap.userDnPatterns}</value>
</list>
</property>
</bean>

<bean id="cdlLdapContextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
<constructor-arg value="${ldap.url}"/>
</bean>

<bean id="cdlAuthoritiesPopulator" class="com.qait.cdl.authentication.customfilter.CdlUserAuthoritiesPopulator" parent="commonAuthoritiesPopulator"/>

<bean id="cdlUserDetailService" class="com.qait.cdl.authentication.service.impl.UserDetailsServiceImpl" parent="commonAuthoritiesPopulator"/>

<bean id="cdlAuthenticationProcessingFilter" class="com.qait.cdl.authentication.customfilter.CustomAuthenticationProcessingFilter" parent="commonPropertyBean">
<property name="authenticationManager" ref="authenticationManager" />
<property name="notificationService" ref="notificationService"/>
<property name="userGroupDao" ref="userGroupDao"/>
</bean>

<bean id="accessDeniedHandler" class="org.springframework.security.web.access.AccessDeniedHandlerImpl">
<property name="errorPage" value="/cdlAccessDenied.htm" />
</bean>

<security:global-method-security secured-annotations="enabled" pre-post-annotations="enabled" />
<bean name="/cdlAccessDenied.htm" class="com.qait.cdl.authentication.web.CDLAccessDeniedHandler"/>
</beans>

在服务方法中我使用了 @Secured({ "ROLE_PERMISSION_UPDATE"}) 如果用户有角色 ROLE_ADMIN 正在登录应用程序并尝试访问此安全方法,然后它抛出访问被拒绝的异常。

最佳答案

我找到了解决方案

<security:global-method-security secured-annotations="enabled"  
pre-post-annotations="enabled">
<security:expression-handler ref="defaultMethodSecurityExpressionHandler"/>
</security:global-method-security>

将其添加到 dispatcher-servlet.xml 中。 spring security 应该有不同的上下文

添加

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
WEB-INF/applicationContext.xml
WEB-INF/dispatcher-servlet.xml
</param-value>
</context-param>

到您的 web.xml 并在 applicationContext.xml 中导入 spring-security.xml 这样做的唯一目的是为 spring security 提供单独的上下文。

要应用基于方法的安全性来处理角色层次结构,请使用 @PreAuthorize("SpEL") 代替 @Secured({})

关于java - Spring security @secure 不适用于角色层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19516208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com