美好的一天, 我有一个spring-boot 1.1.4.RELEASE应用程序,它使用spring-security作为依赖项,例如:
compile("org.springframework.boot:spring-boot-starter-security")
compile("org.springframework.security:spring-security-web:4.0.0.M1")
compile("org.springframework.security:spring-security-config:4.0.0.M1")
compile('org.thymeleaf.extras:thymeleaf-extras-springsecurity3:2.1.1.RELEASE')
我有两种类型的角色:“用户”和“管理员”。后者具有前者的所有功能,但也可以访问管理屏幕。在我的Thymeleaf页面中,我只显示指向具有管理员角色的用户的链接,该工作正常:
<li sec:authorize="hasRole('ADMIN')">
<i class="fa fa-link"></i><a th:href="@{/admin}">
Administer User</a>
</li>
但是,如果我手动输入该页面的网址(http://localhost:9001/admin
),则所有角色都可以访问它。我以为我是通过安全配置类来控制它的:
@Configuration
@EnableWebMvcSecurity
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {
@Autowired
private CustomUserDetailsService customUserDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers( "/" ).permitAll()
.antMatchers("/admin/").hasRole("ADMIN") <== also tried .antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers( "/resources/**" ).permitAll()
.antMatchers( "/css/**" ).permitAll()
.antMatchers( "/libs/**" ).permitAll();
http
.formLogin().failureUrl( "/login?error" )
.defaultSuccessUrl( "/" )
.loginPage( "/login" )
.permitAll()
.and()
.logout().logoutRequestMatcher( new AntPathRequestMatcher( "/logout" ) ).logoutSuccessUrl( "/" )
.permitAll();
http
.sessionManagement()
.maximumSessions( 1 )
.expiredUrl( "/login?expired" )
.maxSessionsPreventsLogin( true )
.and()
.sessionCreationPolicy( SessionCreationPolicy.IF_REQUIRED )
.invalidSessionUrl( "/" );
http
.authorizeRequests().anyRequest().authenticated();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
PasswordEncoder encoder = new BCryptPasswordEncoder();
auth.userDetailsService( customUserDetailsService ).passwordEncoder( encoder );
}
}
我的配置中是否有丢失或不正确的内容?
更新: 根据Dave的回答,我使用的解决方案是使用以下三行:
.antMatchers( "/admin**" ).hasAuthority("ADMIN" )
.antMatchers( "/admin/" ).hasAuthority( "ADMIN" )
.antMatchers( "/admin/**" ).hasAuthority( "ADMIN" )
这将在浏览器上呈现403错误。最终我会尝试将其重定向到错误页面或“/”。
答案 0 :(得分:1)
您只明确保护&#34; / admin /&#34; (带斜线)。我想你需要更精确,如果你正在访问&#34; / admin&#34; (没有斜杠)。