Spring Boot Security - Thymeleaf sec:authorize-url无效

时间:2014-05-15 18:28:30

标签: spring spring-security spring-boot thymeleaf spring-java-config

sec:authorize-url 标记默认情况下不适用于Spring启动安全性:

git clone https://github.com/spring-projects/spring-boot

项目spring-boot-sample-web-method-security:

添加依赖

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity3</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>

从样本中调整控制器:

@RequestMapping("/")
public String home(Map<String, Object> model) {
model.put("message", "Hello World");
model.put("title", "Hello Home");
model.put("date", new Date());
return "home";
}

@RequestMapping("/admin/foo")
public String home2(Map<String, Object> model) {
    model.put("message", "Hello World");
    model.put("title", "Hello Home");
    model.put("date", new Date());
    return "home";
}

添加与应用程序安全性匹配的URL:

http.authorizeRequests().antMatchers("/login").permitAll()
    .antMatchers("/admin/**").hasRole("ADMIN")
...

在home.html中添加testcode

<div sec:authorize="hasRole('ROLE_ADMIN')">
    has role admin
 </div>
 <div sec:authorize-url="/admin/foo">
    can see /admin
 </div>

当我启动应用程序并登录时,我将始终看到&#34;可以看到/ admin&#34;部分无论我是否真的可以访问网址。角色评估本身按预期工作,url权限本身也是如此(当我尝试使用ROLE_USER访问它时,我得到403.)

如果我向Web安全配置添加一个伪特权评估器,它只是为每个请求返回false,那么 div 将正确消失。

我在这里遗漏了什么吗?这是预期的行为,我需要定义什么来使authorize-url以与使用xml配置安全性时常用的方式一起工作?

更新:基本身份验证

此问题与 SpringBootWebSecurityConfiguration 中的基本身份验证及其自动配置相关联:

SampleMethodSecurityApplication 中,通过替换以下内容更改ApplicationSecurity订单:

@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)

@Order(SecurityProperties.BASIC_AUTH_ORDER + 1)

并在spring boot application.properties

中停用basic
security.basic.enabled: false

现在authorize-url标记将按预期工作,但您当然丢失了http basic AutoConfiguration。

离开 security.basic.enabled:true 并将ApplicationSecurity的顺序更改为高于BASIC_AUTH_ORDER将使您获得基本身份验证而不是表单登录...

更新 - PrivilegeEvaluator

我找到了以下解决方法。只需在SecurityConfig中手动注册安全拦截器:

@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(final WebSecurity web) throws Exception {
        final HttpSecurity http = getHttp();
        web.postBuildAction(new Runnable() {
            @Override
            public void run() {
                web.securityInterceptor(http.getSharedObject(FilterSecurityInterceptor.class));
            }
        });
    }

它允许您使用推荐的ACCESS_OVERRIDE_ORDER和http基本自动配置。我已发布更多详情here 任何解释为什么这是有效的。

1 个答案:

答案 0 :(得分:1)

使用 thymeleaf-extras-springsecurity4 应解决问题

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>