Spring security spring安全拦截url访问

Spring security spring安全拦截url访问,spring-security,Spring Security,在我们的应用程序中,我们有以下功能: <intercept-url pattern="/app/**" access="ROLE_ADMIN,ROLE_USER,ROLE_CUST_ADMIN" /> 但是,这会导致会话超时,用户需要登录。在更改之前,用户登录被记住 感谢任何解决方案 谢谢几件事: 访问应用程序中的功能所需的角色不应更改-将其更多地视为权限而不是角色。这里的Spring Security默认值可能用词不当。然后,您可以通过自己的代码将权限集映射到角色,允许将自定义角

在我们的应用程序中,我们有以下功能:

<intercept-url pattern="/app/**" access="ROLE_ADMIN,ROLE_USER,ROLE_CUST_ADMIN" />
但是,这会导致会话超时,用户需要登录。在更改之前,用户登录被记住

感谢任何解决方案 谢谢

几件事:

访问应用程序中的功能所需的角色不应更改-将其更多地视为权限而不是角色。这里的Spring Security默认值可能用词不当。然后,您可以通过自己的代码将权限集映射到角色,允许将自定义角色创建为不同的权限包,但您正在编码/检查的实际权限是静态的,它们不会更改。对用户进行身份验证时,您在UserDetails中填充的GrantedAuthority集应该是基于用户分配的角色的权限的合并集合

也就是说,我认为您仍然可以在不改变安全模型的情况下使用。假设您使用的是安全命名空间,即xmlns=http://www.springframework.org/schema/security,然后需要在元素上设置use expressions=true,并将access属性值更改为SpEL表达式,例如:

<http use-expressions="true">
    <intercept-url pattern="/app/**" access="hasAnyRole('ROLE_ADMIN','ROLE_USER','ROLE_CUST_ADMIN')" />
    <intercept-url pattern="/other1/**" access="isAuthenticated()" />
    <intercept-url pattern="/other2/**" access="authentication.authorities.?[authority.startsWith('ROLE_')].size() != 0" />
</http>
希望这有帮助

请注意这里的类似问题: 在类中使用Spring的@PreAuthorize注释,并通过引用自定义权限计算器。不要担心构建表达式解析器,因为您只需从注释中引用布尔方法即可:

@PreAuthorize("@myCustomClass.booleanMethod(param1, param2, #passedParam) and isAuthenticated()")
myMethod(passedParam) {
    //do something
}
然后,在自定义类中,定义boolean方法,它可以根据您的喜好处理您的角色权限,包括访问数据库以发现新添加的角色


您将无法动态地将新角色添加到XML配置中,因此,如果您的问题与新角色创建有关(似乎是这样),那么您将需要类似于上面的内容来实现它。使用SpEL和自定义布尔方法,您可以访问一组潜在的无限限制和需求,您可以将这些限制和需求添加到应用程序中。

谢谢您的回答。我尝试了以下方法,但在所有情况下,我的应用程序在其他方面都失败了。事实证明,删除拦截url检查会导致其他一些副作用。我想,我只是删除了一个访问检查,但是,其他的东西坏了。。1我用自定义方法尝试了SpEl。已调用该方法,但我的应用程序在其他页面中失败。。所以,你的建议/解决方案奏效了,但是,我需要在应用程序中注意其他问题。谢谢你的回答。正如您所解释的,在注释和评估器的帮助下,我们已经有了服务层安全性。对于我的拦截url问题,我认为只要删除该检查就可以解决我的问题,因为我们无论如何都要在应用程序中进行身份验证检查。。但是,当我删除截取url检查时,该应用程序在其他方面失败了。我想知道这项检查是否有副作用,使应用程序保持良好状态。。不知道是什么,奇怪。我的应用根本没用;我通过自定义权限计算器删除了它们,以支持控制器级别的安全性。我希望我能多帮点忙。祝你好运
SecurityContextHolder.getContext()
@PreAuthorize("@myCustomClass.booleanMethod(param1, param2, #passedParam) and isAuthenticated()")
myMethod(passedParam) {
    //do something
}