【问题标题】:Spring Security-acl. Users do not receive permissionSpring Security-acl。用户未获得权限
【发布时间】:2013-06-23 14:19:29
【问题描述】:

好像没事。授权有效,用户获得角色。我保护了使用注释的方法(例如 @PreAuthorize("hasPermission(#post, 'READ')") ),它可以工作并且我被拒绝访问。我创建了一个数据库,他在其中描述了用户对对象的权利。我创建了一个数据库,其中包含用户对对象的权限。

我的问题是用户授权后,并没有获得权限,即使用户有权限反对,他也被拒绝访问。另外,我注意到,在用户登录服务器的日志文件后,应该会得到一个字符串,该字符串将写入他获得的权限,但我没有这样的行。

我的文件碎片:

web.xml

...
<filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring-security.xml
        /WEB-INF/acl-context.xml
        /WEB-INF/mvc-dispatcher-servlet.xml 
    </param-value>
</context-param>...

mvc-dispatcher-servlet.xml

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

<context:annotation-config />

<tx:annotation-driven />
<tx:jta-transaction-manager />

<context:component-scan base-package="com.bla-bla.bla.controllers" />

<mvc:annotation-driven />
...

spring-security.xml

    ...
<security:http auto-config="true" use-expressions="true"
    access-denied-page="/auth/denied.html">
    <security:intercept-url pattern="/auth/login.html" access="permitAll" />
    <security:form-login login-page="/auth/login.html"
        authentication-failure-url="/auth/login.html?error=true"
        default-target-url="/index.html" />
    <security:logout invalidate-session="true"
        logout-success-url="/auth/login.html" logout-url="/auth/logout.html" />
</security:http>

<security:authentication-manager>
    <security:authentication-provider
        user-service-ref="userService">
        <security:password-encoder ref="pswEncoder" />
    </security:authentication-provider>
</security:authentication-manager>

<bean id="userService"
    class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
    <property name="dataSource" ref="jndiJboss" />
    <property name="usersByUsernameQuery"
        value="SELECT login, pass, enabled FROM accounts WHERE login=?" />
    <property name="authoritiesByUsernameQuery"
        value="SELECT login, authority FROM accounts WHERE login=?" />
</bean>

<bean
    class="org.springframework.security.authentication.encoding.Md5PasswordEncoder"
    id="pswEncoder" />
...

acl-context.xml

    ...
<bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"
    p:permissionEvaluator-ref="permissionEvaluator"
    p:roleHierarchy-ref="roleHierarchy" />

<bean class="org.springframework.security.acls.AclPermissionEvaluator" id="permissionEvaluator">
    <constructor-arg ref="aclService"/>
</bean>

<bean class="org.springframework.security.acls.jdbc.JdbcMutableAclService" id="aclService">
    <constructor-arg ref="jndiJboss"/>
    <constructor-arg ref="lookupStrategy"/>
    <constructor-arg ref="aclCache"/>
</bean>

<bean id="lookupStrategy" class="org.springframework.security.acls.jdbc.BasicLookupStrategy">
    <constructor-arg ref="jndiJboss"/>
    <constructor-arg ref="aclCache"/>
    <constructor-arg ref="aclAuthorizationStrategy"/>
    <constructor-arg ref="auditLogger"/>
</bean>

 <bean id="jndiJboss" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:/JBossDB"/>
</bean>

<bean id="aclCache" class="org.springframework.security.acls.domain.EhCacheBasedAclCache">
    <constructor-arg>
        <bean class="org.springframework.cache.ehcache.EhCacheFactoryBean">
            <property name="cacheManager">
                <bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>
            </property>
            <property name="cacheName" value="aclCache"/>
        </bean>
    </constructor-arg>
</bean>

<bean id="aclAuthorizationStrategy" class="org.springframework.security.acls.domain.AclAuthorizationStrategyImpl">
    <constructor-arg>
        <list>
            <bean class="org.springframework.security.core.authority.GrantedAuthorityImpl">
                <constructor-arg value="ROLE_ADMIN"/>
            </bean>
            <bean class="org.springframework.security.core.authority.GrantedAuthorityImpl">
                <constructor-arg value="ROLE_ADMIN"/>
            </bean>
            <bean class="org.springframework.security.core.authority.GrantedAuthorityImpl">
                <constructor-arg value="ROLE_ADMIN"/>
            </bean>
        </list>
    </constructor-arg>
</bean>

<bean id="auditLogger" class="org.springframework.security.acls.domain.ConsoleAuditLogger"/>


<bean id="roleHierarchy"  class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
    <property name="hierarchy">
        <value>
            ROLE_ADMIN > ROLE_USER
        </value>
    </property>
</bean>
...

控制器的受保护方法示例

@Override
@RequestMapping(value = "/post/delete.html", method = RequestMethod.GET)
@Transactional
@PreAuthorize("hasPermission(#post, 'READ')")
public String delete(final Post post) {
    //some actions
    return "post/view";
}

可能是什么问题?

UPD。我的问题是错误填写 acl_object_identity

【问题讨论】:

    标签: spring spring-security acl


    【解决方案1】:

    发布使用 ACL(安全方法调用)的代码,并在 Spring 配置文件中突出显示这些类。另外,为什么要在 MVC 配置文件中放置 &lt;security:global-method-security /&gt; 元素?

    【讨论】:

    • 我编辑了我的第一篇文章,他在那里放置了该方法的示例。 «同时在 Spring 配置文件中突出显示这些类。»你是做什么的?我只有一个控制器文件夹,在其中搜索注释。早些时候我在文件 acl-context.xml 中发布了 ,但是当我移动到文件 mvc-dispatcher-servlet 时它不起作用,注释被忽略了。 xml注解开始起作用了,很奇怪,因为文件acl-context.xml加载了。也许这是我的问题?也许 acl-context.xml 文件没有正确处理?但是为什么...
    • 好的,因为您将 PreAuthorize 应用于控制器,所以在您的 MVC 配置中放置 元素是有意义的。除此之外:1)确保确实应用了 PreAuthorize(调用了基于代理或 AspectJ 的安全拦截器)。 2) 看看你的 aclAuthorizationStrategy bean,你在 ROLE_ADMIN 的构造函数参数列表中有三个项目? 3) 你确定你没有从 AclCache 获得缓存权限吗?
    • 1) 我需要分析我的日志文件吗?或者还有其他方法吗? 2) AclAuthorizationStrategyImpl 是 AclAuthorizationStrategy 的默认实现。注意构造函数接受三个参数。基于Spring Security API,构造函数签名如下:public AclAuthorizationStrategyImpl(GrantedAuthority[] auths).对吧? 3)嗯......我没有考虑过。如何查看?
    • 1) 是的,确保 Spring 在 DEBUG 处记录日志。 2) 我的意思是:你为什么要通过相同的 GrantedAuthorityImpl (ROLE_ADMIN) 三次? 3) 尝试使用空 AclCache。此外,您用于 BasicLookupStrategy 的构造函数已被弃用(查看以 PermissionGrantingStrategy 作为参数的版本)。还可以查看 github.com/SpringSource/spring-security/tree/master/samples/… 以获取有关使用 ACL 的示例。
    猜你喜欢
    • 2012-10-12
    • 2013-04-17
    • 2014-05-11
    • 2013-11-07
    • 2011-09-02
    • 2011-11-20
    • 2014-02-18
    • 2016-02-27
    相关资源
    最近更新 更多