在我目前的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>
其中只应在同一时间显示其中一个片段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;
}
}
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();
}
}
答案 0 :(得分:11)
我的解决方法是将thymeleaf-extras-springsecurity4
添加到我的网络应用依赖项中。
我有一个父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>
瞧......它现在有用了。
我试图在百万富翁模板(.html文件)中执行<div sec:authorize="hasRole('ROLE_USER')"></div>
,以便在用户登录时仅显示div及其内容。但是,它始终显示div。
我希望它会抛出一个错误,说它在包含百万美元额外依赖之前无法识别弹簧安全标签......它会使调试变得更容易。
答案 1 :(得分:3)
这可能是因为你的类路径上缺少百合花 - 额外 - 弹簧安全4神器。我遇到了这个问题,并发现(在把我的大部分头发拉出来之后)SpringSecurity方言没有加载到百里香,因为罐子的缺席。通过以下方式添加了此依赖项:
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>
答案 2 :(得分:0)
尝试了上述所有方法,但对我不起作用,但是可能对其他人有用。对我有用的是:
<properties>
<thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>
<thymeleaf-extras-springsecurity4.version>3.0.2.RELEASE</thymeleaf-extras-springsecurity4.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
这是我的百里香叶的配置设置:
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(thymeleafTemplateResolver());
templateEngine.setEnableSpringELCompiler(true);
templateEngine.addDialect(new SpringSecurityDialect());
return templateEngine;
}
@Bean
public SpringResourceTemplateResolver thymeleafTemplateResolver() {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setPrefix("classpath:templates/");
templateResolver.setSuffix(".html");
templateResolver.setCacheable(false);
templateResolver.setTemplateMode(TemplateMode.HTML);
return templateResolver;
}
@Bean
public ThymeleafViewResolver thymeleafViewResolver() {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine());
viewResolver.setCharacterEncoding("UTF-8");
return viewResolver;
}
答案 3 :(得分:-1)
在您的配置中,您已将所有网址设置为匿名访问
.antMatchers("/b3/**", "/v1.1/**", "/**", "/destaque/**", "/categoria/**").permitAll()
试试这个
.antMatchers("/b3/**", "/v1.1/**", "/**", "/destaque/**", "/categoria/**")
.anyRequest().authenticated()
.and()
由于permitAll(),匿名用户以及经过身份验证的用户都可以访问所有URL,因此两者都可以显示。尝试切换机箱以避免此类陷阱。
答案 4 :(得分:-2)
在我改变的情况下
spring.jpa.hibernate.ddl-auto=auto
到
spring.jpa.hibernate.ddl-auto=none
application.properties 文件中的是解决方案。