Spring Boot Security - Thymeleaf sec:authorize-url 不起作用

Posted

技术标签:

【中文标题】Spring Boot Security - Thymeleaf sec:authorize-url 不起作用【英文标题】:Spring Boot Security - Thymeleaf sec:authorize-url not working 【发布时间】:2014-07-04 08:38:40 【问题描述】:

sec:authorize-url标签默认不支持Spring boot security:

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 中添加测试代码

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

当我启动应用程序并登录时,无论我是否可以实际访问该 url,我都会看到“可以看到 /admin”部分。角色评估本身按预期工作,url 权限本身也是如此(当我尝试使用 ROLE_USER 访问它时得到 403)。

如果我在 web 安全配置中添加一个虚拟 privilegeEvaluator,它只为每个请求返回 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 基本自动配置。

离开 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 任何解释为什么这样的作品都值得赞赏。

【问题讨论】:

我遇到了完全相同的问题。在调试期间,我发现DefaultWebInvocationPrivilegeEvaluator 使用不同的AbstractSecurityInterceptor 评估权限,然后才是真正的过滤器。 DefaultWeb.. 使用的 AbstractSecurityInterceptor 仅包含一条记录 - /** - hasAnyRole(USER, ADMIN)。我还没有找到解决这个问题的方法。自从您发布问题后,您有什么发现吗? 【参考方案1】:

使用 thymeleaf-extras-springsecurity4 应该可以解决问题

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

【讨论】:

以上是关于Spring Boot Security - Thymeleaf sec:authorize-url 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Security 管理 Spring Boot 中的会话?

微服务和 Spring Security OAuth2

Spring Security with Boot

Spring Boot整合Thymeleaf

spring boot Security 简单使用

Spring Boot Security