在我们的应用程序中,我们有以下内容:
<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)
但是,这会导致会话超时,用户需要登录.在更改之前,记住了用户登录.
感谢任何解决方案
几件事:
您在应用程序中访问功能所需的角色不应更改 - 将其视为"权限"而非"角色".(此处的Spring Security默认值可能用词不当.)然后,您可以将权限集映射到角色(通过您自己的代码),允许将自定义角色创建为不同的权限包,但您正在编码的实际权限/检查是静态的 - 它们不会改变.对用户进行身份验证时,GrantedAuthority您在其中填充的s 集UserDetails应该是基于用户指定角色的合并权限集合.
也就是说,我认为通过使用基于表达式的访问控制,您可以在不更改安全模型的情况下继续执行您想要的操作.假设你正在使用的安全命名空间(即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使用通配符授权访问角色
| 归档时间: |
|
| 查看次数: |
23134 次 |
| 最近记录: |