spring security intercept-url access

use*_*937 0 spring-security

在我们的应用程序中,我们有以下内容:

<intercept-url pattern="/app/**" access="ROLE_ADMIN,ROLE_USER,ROLE_CUST_ADMIN" />
Run Code Online (Sandbox Code Playgroud)

但是,在我们的应用程序中,我们也可以创建自定义角色,并且,当自定义角色的用户ROLE_LIMITED_USER尝试登录时,访问将被拒绝.

如何在不列出角色的情况下保护应用程序?或者我怎样才能让它接受一个模式ROLE_*

我尝试了以下方法:

<intercept-url pattern="/app/**" access="IS_AUTHENTICATED_FULLY" />
Run Code Online (Sandbox Code Playgroud)

但是,这会导致会话超时,用户需要登录.在更改之前,记住了用户登录.

感谢任何解决方案

sup*_*rEb 8

几件事:

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

  2. 也就是说,我认为通过使用基于表达式的访问控制,您可以在不更改安全模型的情况下继续执行您想要的操作.假设你正在使用的安全命名空间(即xmlns="http://www.springframework.org/schema/security"),那么你就需要设置use-expressions="true"<http>元素,改变你的access属性值,以规划环境地政司表达式,如:

    <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>
    
    Run Code Online (Sandbox Code Playgroud)

请注意,此代码段尚未经过测试,我非常确定第3个intercept-url示例不会按原样运行,但应该非常接近.(它正在尝试过滤Collection<GrantedAuthority>以开头的权限ROLE_并确保过滤后的列表不为空.)

我的猜测是,使用第二个更容易intercept-url并在代码中进行任何进一步的自定义检查,您可以通过以下方式访问当前的SecurityContext/ Authentication/主体:

SecurityContextHolder.getContext()
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

同样请注意类似的问题: Spring Security使用通配符授权访问角色