others - spring - 在thymeleaf视图中,sec:authorize isAuthenticated() 和 isAnonymous()返回true

在我当前的spring-boot项目中,在thymeleaf视图中有如下代码:


<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>



现在,当我在浏览器中打开这个视图时,这两个区域正在显示。

谁知道这里有什么错误?

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;


 }



}



ps :我的spring安全配置类是:


@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();


 }


}



时间:

我的修复办法是将thymeleaf-extras-springsecurity4添加到我的web应用程序依赖项。

我有一个父pom正在导入spring boot (1.4.1.RELEASE ),其中包括thymeleaf Extras,但是我的孩子pom (其中包含Web应用程序代码)需要像下面这样调用特定的thymeleaf Extras依赖项:

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

现在它可以工作了。

我尝试过 <div sec:authorize="hasRole('ROLE_USER')"></div>在thymeleaf模板(html文件)中仅显示该div及它用户登录时的内容,但是,它始终显示div。

它会使调试更加容易。

这可能是由于thymeleaf-extras springsecurity4构件在classpath上丢失了,添加了此依赖项:


<dependency>


 <groupId>org.thymeleaf.extras</groupId>


 <artifactId>thymeleaf-extras-springsecurity4</artifactId>


</dependency>



在我的情况下


spring.jpa.hibernate.ddl-auto=auto




spring.jpa.hibernate.ddl-auto=none



在application.properties文件中是解决方案。

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


.antMatchers("/b3/**","/v1.1/**","/**","/destaque/**","/categoria/**").permitAll()



试试这个


.antMatchers("/b3/**","/v1.1/**","/**","/destaque/**","/categoria/**")


 .anyRequest().authenticated()


 .and()



由于permitAll(),所有的url都可以由匿名用户访问,也可以通过身份验证的用户访问。

...