我有
<security:http use-expressions="true">
<security:intercept-url pattern="/**/*" access="hasRole('ROLE_USER')"/>
在 Spring Security 上下文配置文件中和
@PreAuthorize("permitAll")
@RequestMapping("/public")
public String aMethod() {
// ...
}
在 Controller 中。
我想要的是除 public
之外的所有 URL 都需要身份验证。这可能吗?
最佳答案
<intercept-url>
XML 中的优先级高于注释。 <intercept-url>
在 URL 级别工作,在方法级别注释。
如果您要使用spring security
和spring
<form-login />
那么下面的方法会更好地为您服务。
<intercept-url pattern="/public/**"
access="permitAll" />
<intercept-url pattern="/restricted/**"
access="hasAnyRole('ROLE_USER', 'ROLE_ADMIN', 'ROLE_SOME')
@PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SOME')")
@RequestMapping("/restricted/aMethod")
public String aMethod() {
// ...
}
restricted
下的任何内容可以由三个不同的角色访问。但具体路径restricted/aMethod
可以通过@PreAuthorize("ROLE_ADMIN")
访问和@PreAuthorize("ROLE_SOME")
但不是@PreAuthorize("ROLE_USER")
。默认情况下,所有三个角色都可以访问,但是当您使用 @PreAuthorize("ROLE_ADMIN")
标记某些路径时然后用户输入 ROLE_ADMIN
可以访问该路径。
如果你仔细想想,@PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_SOME')")
充当来自一大组 ROLES
的缩小或过滤访问单个(或一组角色)ROLE
.
正如您所注意到的, /restricted
都没有路径可通过 permitAll
访问。最好有/static/*.css
以及permitAll
下的其他人.
HTH
关于spring-security - @PreAuthorize 和拦截 url 优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28549538/