无法基于安全性隐藏链接

Posted

技术标签:

【中文标题】无法基于安全性隐藏链接【英文标题】:Unable to hide links based on security 【发布时间】:2019-04-08 19:43:28 【问题描述】:

我试图仅在允许用户角色的情况下显示链接。 但是链接并没有隐藏,任何角色的所有内容都会显示出来。

在这里看到很多类似的查询,但没有一个解决方案有效。请告知我所缺少的。

配置。

@Configuration
@EnableWebSecurity
public class SecConfig extends WebSecurityConfigurerAdapter

    private final String USER = "USER";
    private final String ADMIN = "ADMIN";

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.authorizeRequests()
                .antMatchers("/").hasAnyRole(USER, ADMIN)
                .antMatchers("/closed").hasRole(ADMIN).and()
                .formLogin().defaultSuccessUrl("/");
    

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 
        auth.inMemoryAuthentication()
                .withUser("jane").password(passwordEncoder().encode("qwe")).roles(ADMIN, USER).and()
                .withUser("john").password(passwordEncoder().encode("qwe")).roles(USER);
    

    @Bean
    public BCryptPasswordEncoder passwordEncoder()
        return new BCryptPasswordEncoder();
    

POM

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

html

<a th:href="@/closed">Go to closed</a>

<br/><br/>

<form th:action="@/logout" method="post">
    <input type="submit" value="Log out">
</form>

<br/>

<h2>Welcome</h2>
<p>Spring Security Thymeleaf</p>
<div sec:authorize="hasRole('USER')">Text visible to user.</div>
<div sec:authorize="hasRole('ADMIN')">Text visible to admin.</div>
<div sec:authorize="isAuthenticated()">
    Text visible only to authenticated users.
</div>
Authenticated username:
<div sec:authentication="name"></div>
Authenticated user roles:
<div sec:authentication="principal.authorities"></div>

上面的所有内容都会显示给 Jane,即使她没有管理员访问权限。另外,甚至她的角色和用户名也没有显示。

我也尝试如下配置方言,这没有区别。

@Configuration
public class LeafConfig 

    @Bean
    public SpringSecurityDialect springSecurityDialect()
        return new SpringSecurityDialect();
    

以下是 Jane 或 John 显示的内容,没有区别:

Welcome
Spring Security Thymeleaf

Text visible to user.
Text visible to admin.
Text visible only to authenticated users.
Authenticated username:
Authenticated user roles:

【问题讨论】:

【参考方案1】:

由于您使用的是 Spring Security 附加功能,因此您可以尝试使用 $#authorization.expression('hasRole(''ROLE_ADMIN'')' 而不是 sec:authorization。例如。

<div th:if="$#authorization.expression('hasRole(''USER'')'">Text visible to user.</div>
<div th:if="$#authorization.expression('hasRole(''ADMIN'')'">Text visible to admin.</div>
<div th:if="$#authorization.expression('isAuthenticated()')">
    Text visible only to authenticated users.
</div>

如果您使用权限而不是角色,下面的代码可以解决问题。

<div th:if="$#authorization.expression('hasAuthority(''ADMIN'')')">ADMIN</div>
     <div th:if="$#authorization.expression('hasAuthority(''USER'')')">USER</div>
     <div th:if="$#authorization.expression('isAuthenticated()')">
         Text visible only to authenticated users.
     </div>
</div>

关于您的配置,将您的org.thymeleaf.extras 更改为.pom 中的thymeleaf-extras-springsecurity5,您需要将Spring Dialect @Bean 添加到您的配置中。

POM

<dependencies>
    ...
    <dependency>
        <groupId>org.thymeleaf.extras</groupId>
        <artifactId>thymeleaf-extras-springsecurity5</artifactId>
    </dependency>
    ...
</dependencies>

LeafConfig

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.thymeleaf.extras.springsecurity5.dialect.SpringSecurityDialect;

@Configuration
public class LeafConfig 

    @Bean
    public SpringSecurityDialect springSecurityDialect()
        return new SpringSecurityDialect();
    


进行这些更改后,一切都应按预期工作。

【讨论】:

上面试过,调整了''标记。还是一样,非管理员用户可以看到管理员文本。 那些不是“,而是双引号。其他的有效吗? 另外,您使用的是角色还是权限? 尝试过的角色和权限。结果相同。对于您的答案,如果我按原样使用它而不更改“”标记,则会引发错误。我是不是错过了什么。对我来说,这看起来像是一个语法问题。我应该按原样使用您的解决方案吗? IDE似乎也抱怨。参考截图 -> imgur.com/a/gIDIByI 是的,您应该按原样使用它。事实上,我刚刚尝试了我的项目,它运行良好。就我而言,尽管我将其与当局一起使用。我将对其进行更新以使其与当局一起使用。【参考方案2】:

你应该像下面这样使用它:

<sec:authorize access="hasRole('ADMIN')">
  <div>
    This content will only be visible to users who have
    the "ADMIN" authority in their list of GrantedAuthority's.
  </div>
</sec:authorize>

【讨论】:

以上不起作用会有所作为。不是管理员的约翰可以看到它。 访问标签内的内容只有拥有管理员角色之一的用户才能看到。你试过了吗? 澄清一下,问题不在于无法看到隐藏的文本。问题是无论角色如何,我都可以看到文本。所以 ADMIN 和 USER 都能看到不正确的文本。

以上是关于无法基于安全性隐藏链接的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Spring 安全登录 - 使用外部数据库的基于注释的配置

隐藏Nginx版本号的安全性与方法

安全牛学习笔记手动漏洞挖掘-SQL盲注

安全牛学习笔记​手动漏洞挖掘-SQL盲注

Web信息安全实践_3.4 CSRF防御

Apache网页与安全优化——防盗链和隐藏版本(理论实践相结合!)