我正在尝试使用Spring Security,所有人都使用过一个角色。
我想根据 ROLE 重定向到2个不同的网站,但框架始终重定向到最后的 defaultSuccessUrl(“/...”)**。这有可能吗?
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN")
.and().withUser("user").password("user").roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/admin/**")
.access("hasRole('ROLE_ADMIN')").and().formLogin()
.defaultSuccessUrl("/admin**").loginPage("/")
.failureUrl("/").usernameParameter("username")
.passwordParameter("password").and().logout()
.logoutSuccessUrl("/").and()
.authorizeRequests().antMatchers("/user/**")
.access("hasRole('ROLE_USER')").and().formLogin()
.defaultSuccessUrl("/user**").loginPage("/")
.failureUrl("/").usernameParameter("username")
.passwordParameter("password").and().logout()
.logoutSuccessUrl("/");
http.csrf().disable();
}
}
答案 0 :(得分:7)
执行此操作的最佳方法是将用户发送到URL,然后创建一个处理default-target-url的控制器。例如,以下内容将用户发送到/ default:
http
.formLogin()
.defaultSuccessUrl("/default")
现在创建一个处理URL" / default"的控制器。控制器应根据滚动重定向或转发。下面是使用Spring MVC的示例,但任何类型的控制器都可以工作(即Struts,Servlet等)。
@Controller
public class DefaultController {
@RequestMapping("/default")
public String defaultAfterLogin(HttpServletRequest request) {
if (request.isUserInRole("ROLE_ADMIN")) {
return "redirect:/admin/";
}
return "redirect:/user/";
}
}
这种方法的优点是它没有与任何特定的安全性实现相结合,它没有与任何特定的MVC实现相结合,并且它可以轻松地与XML和Java配置方法一起使用。
一些补充说明:
以下是代码的清理版本:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth
.inMemoryAuthentication()
.withUser("admin")
.password("admin")
.roles("ADMIN")
.and()
.withUser("user")
.password("user")
.roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasRole("USER")
.and()
.formLogin()
.defaultSuccessUrl("/default")
.loginPage("/")
.failureUrl("/")
.and()
.logout()
.logoutSuccessUrl("/")
.and()
// It is generally BAD to disable CSRF protection!
.csrf().disable();
}
}
答案 1 :(得分:0)
这对我有用。
@RequestMapping(value= {"/default"}, method = RequestMethod.GET)
public String defaultAfterLogin() {
Collection<? extends GrantedAuthority> authorities;
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
authorities = auth.getAuthorities();
String myRole = authorities.toArray()[0].toString();
String admin = "admin";
if (myRole.equals(admin)) {
return "redirect:/admin/";
}
return "redirect:/r/";
}