sec:授权在thymeleaf视图中为isAuthenticated()和isAnonymous()返回true

Kle*_*ota 6 spring spring-security thymeleaf

在我目前的spring-boot项目中,我在我的视图中看到了一段代码:

<div class="account">
    <ul>
        <li id="your-account" sec:authorize="isAnonymous()">
            ... code 1 ...
        </li>
        <li id="your-account" sec:authorize="isAuthenticated()">
            ... code 2 ...
        </li>
        <li th:if="${cart}">
            ...
        </li>
    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

其中只应在同一时间显示其中一个片段1或2.但是现在,当我在浏览器中打开此视图时,正在显示这两个区域.

任何人都可以看到这里有什么问题?

ps:我的thymeleaf配置类是这样的:

@Configuration
public class Thymeleaf {

  @Bean
  public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine engine  =  new SpringTemplateEngine();

    final Set<IDialect> dialects = new HashSet<IDialect>();
    dialects.add( new SpringSecurityDialect() );
    engine.setDialects( dialects );

    return engine;
  }

}
Run Code Online (Sandbox Code Playgroud)

ps.:我的spring-security配置类是:

@Configuration
@ComponentScan(value="com.spring.loja")
@EnableGlobalMethodSecurity(prePostEnabled=true)
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Autowired
        private UserDetailsService userDetailsService;

        @Autowired
        private SocialUserDetailsService socialUserDetailsService;

        @Autowired
        private PasswordEncoder passwordEncoder;

        @Autowired
      private AuthenticationManagerBuilder auth;

        @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
                .disable()
            .authorizeRequests()
                .antMatchers("/b3/**", "/v1.1/**", "/**", "/destaque/**", "/categoria/**").permitAll()
                .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .loginPage("/signin")
                    .loginProcessingUrl("/login").permitAll()
                    .usernameParameter("login")
                    .passwordParameter("senha")
                    .and()
                .logout()
                    .logoutUrl("/logout")
                    .logoutSuccessUrl("/")
                    .and()
                .apply(new SpringSocialConfigurer());
    }

        @Override
        public void configure(WebSecurity web) throws Exception {
            DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler();
        handler.setPermissionEvaluator(new CustomPermissionEvaluator());
        web.expressionHandler(handler);
    }

        @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .userDetailsService(userDetailsService)
            .passwordEncoder(passwordEncoder);
    }

        @Bean
        @Override
        public AuthenticationManager authenticationManagerBean() throws Exception {
            return auth.getOrBuild();
        }
}
Run Code Online (Sandbox Code Playgroud)

小智 11

我的修复是添加thymeleaf-extras-springsecurity4到我的Web应用程序依赖项.

我有一个导入春季启动(1.4.1.RELEASE)的父pom,其中包括百万美元的额外内容,但是我的孩子pom(包含网络应用程序代码)需要调出特定的百日咳附加功能,如下所示:

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

瞧......它现在有用了.

我试图<div sec:authorize="hasRole('ROLE_USER')"></div>在百万美元模板(.html文件)中进行操作,仅在用户登录时显示div及其内容.但是,它一直显示div.

我希望它会抛出一个错误,说它在包含百万美元额外依赖之前无法识别弹簧安全标签......它会使调试变得更容易.

  • 如果您查看功能已损坏的源,您会注意到sec:标签只是简单地发送到客户端而不是由服务器评估(这就是div一直显示的原因).我在同一个修复程序中遇到了同样的问题 - 很难追踪,因为大多数代码示例只包含HTML而没有提到依赖性要求. (3认同)

小智 -1

在您的配置中,您已将所有 URL 设置为具有匿名访问权限

.antMatchers("/b3/**", "/v1.1/**", "/**", "/destaque/**", "/categoria/**").permitAll()
Run Code Online (Sandbox Code Playgroud)

尝试这个

.antMatchers("/b3/**", "/v1.1/**", "/**", "/destaque/**", "/categoria/**")
    .anyRequest().authenticated()
                .and()
Run Code Online (Sandbox Code Playgroud)

由于permitAll(),所有的url都可以被匿名用户访问,也可以被认证用户访问,所以两者都会被显示。尝试使用 switch case 来避免此类陷阱。