当用户点击http://localhost:8080时,我需要通过spring security显示基于自定义的登录表单(/auth/login.html)。如果用户使用admin角色成功登录,请将用户重定向到/admin/adminsuccess.html。管理员用户重定向到/adminsuccess.html后,我需要允许管理员用户访问其他网页,例如(/admin/assetallocate.html,/admin/assetdeallocate.html..)如果用户未使用admin角色登录,请显示包含错误的相同登录页面。
以下是我的代码:
@Configuration
public class AssetWebConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login").setViewName("auth/login");
registry.addViewController("/admin/adminsuccess").setViewName("admin/auth-success");
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
}
}
@Configuration
@EnableWebSecurity
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.antMatchers("/**").access("hasRole('ROLE_ADMIN')")
.and()
.formLogin()
.loginPage("/login")
.usernameParameter("username")
.passwordParameter("password")
.defaultSuccessUrl("/admin/adminsuccess")
.and()
.logout()
.logoutSuccessUrl("/login?logout")
.permitAll()
.and()
.csrf().disable();
}
}
/auth/login.html
<form name="loginform" th:action="@{/login}" method="post" class="form-signin">
以上代码无论我写的是什么都没有按预期工作。这可能是ant匹配模式的问题。请指导。
更新: 当我点击&#34; http://localhost:8080&#34;时,现在会显示自定义登录页面。但是,当我输入正确的凭据时,它不会重定向查看名称&#39; /admin/auth-success.html'基于AssetWebConfig.java配置。如果我输入正确的凭证,则下面是当前的响应。
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Wed Nov 23 11:42:59 IST 2016
There was an unexpected error (type=Not Found, status=404).
No message available
答案 0 :(得分:0)
是。问题出在您的蚂蚁匹配器上。
根据我的理解,当您说 anyRequest.permitAll 时,它不符合 antMatchers(&#34; / admin / *&#34;)。 (&#34; hasRole(&#39; ROLE_ADMIN&#39;)&#34)强> 因为您要告知网络安全,以便在未经授权的情况下允许每个请求通过。
更改如下,
.antMatchers("/login").permitAll()
.antMatchers("/admin/**").access("hasRole('ADMIN')")
.antMatchers("/**").access("hasRole('USER')")
.and()
.formLogin().loginPage("/login")
.usernameParameter("username")
.passwordParameter("password")
.defaultSuccessUrl("/index")
.failureUrl("/login?error");
https://github.com/satya-j/rab/blob/master/src/main/java/com/satya/rab/config/WebSecurityConfig.java - 参考这个,这是我之前用弹簧安检试过的回购。
编辑:
这是更新
<强> WebSecurityConfig 强>
@Component("authProvider")
public class CustomAuthenticationProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication auth) throws AuthenticationException {
String username = auth.getName();
String password = auth.getCredentials().toString();
if(username.equals("user") && password.equals("user")) {
List<GrantedAuthority> grantedAuths = new ArrayList<GrantedAuthority>();
grantedAuths.add(new SimpleGrantedAuthority("ROLE_USER"));
return new UsernamePasswordAuthenticationToken(username, password, grantedAuths);
} else if(username.equals("admin") && password.equals("admin")) {
List<GrantedAuthority> grantedAuths = new ArrayList<GrantedAuthority>();
grantedAuths.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
grantedAuths.add(new SimpleGrantedAuthority("ROLE_USER"));
return new UsernamePasswordAuthenticationToken(username, password, grantedAuths);
} else {
throw new CustomException("Unable to auth against third party systems");
}
}
@Override
public boolean supports(Class<?> auth) {
return auth.equals(UsernamePasswordAuthenticationToken.class);
}
您可以使用您选择的身份验证提供程序根据用户设置角色。
<强> CustomeAuthenticationProvider 强>
{{1}}
我使用了自定义身份验证。当我玩Spring安全时,我没有进行任何数据库配置。您可以按自己的方式实现它。以上验证了身份验证凭据并设置了角色(权限)。由于管理员也能够查看用户模块(大多数情况下,至少是我的构想),我已经附加了权限用户和&amp;管理员登录时的管理员。简单来说, 1.当用户登录时,他将能够访问每个/ **,但不能访问/ admin / ** 2.当管理员登录时,他将能够访问每个/ **和/ admin / **
我已经测试了这些方案,以及您可以在此处查看的整个代码 - https://github.com/satya-j/rab