Spring 3.2:根据用户角色选择视图

时间:2014-01-12 18:50:14

标签: java spring spring-mvc spring-security

使用版本3.2的 spring-webmvc spring-security-web ,我想根据用户角色(或者用户是否经过身份验证)返回不同的视图或者没有),因此对于"/"请求,角色 ANONYMOUS (或未经过身份验证的用户)的用户获取 welcome 页面和角色 USER 获取主页页面。

我目前的方法是使用常规控制器执行此操作:

@Controller
public class WelcomeCtrl {

    @RequestMapping("/")
    public String welcome(Principal principal) {
        if (userAuthenticated(principal)) {
            return "redirect:home";
        }
        return "welcome";
    }

    private boolean userAuthenticated(Principal principal) {
        return principal != null && principal instanceof Authentication
                && hasUserRole((Authentication) principal);
    }

    private boolean hasUserRole(Authentication principal) {
        Collection<? extends GrantedAuthority> authorities = (principal)
                .getAuthorities();
        return Iterables.contains(Collections2.transform(authorities,
                new Function<GrantedAuthority, String>() {

                    @Override
                    public String apply(GrantedAuthority authority) {
                        return authority.getAuthority();
                    }
                }), "ROLE_USER");
    }

}

但是,我真的不喜欢它,因为我觉得这个重定向应该用spring security来完成(我错了吗?)。您知道使用Spring Security配置执行此操作的方法吗?我目前的配置如下:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/welcome").permitAll()
                .anyRequest().authenticated()
            .and().formLogin()
                .defaultSuccessUrl("/home").permitAll()
                .and().logout().permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder authManagerBuilder)
            throws Exception {
        authManagerBuilder.inMemoryAuthentication().withUser("user")
                .password("password").roles("USER");
    }
}

1 个答案:

答案 0 :(得分:0)

据我所知,这是使用市场上最新弹簧安全配置的最佳方式。

在Spring 3.1中向Spring框架添加了对Java Configuration的一般支持。自Spring Security 3.2以来,一直有Spring Security Java Configuration支持,使用户无需使用任何XML即可轻松配置Spring Security。

如果您熟悉安全命名空间配置,那么您应该发现它与安全Java配置支持之间存在很多相似之处,您可以使用安全命名空间配置以及哪些套件

你可以使用弹簧安全3.2添加许多新东西 喜欢

1)。 Java配置 - 更适合那些更熟悉读取jar文件以应用配置方法的人。

2)。并发支持 - 在大多数环境中,安全性基于每个线程存储。这意味着当在新线程上完成工作时,SecurityContext将丢失。 Spring Security提供了一些基础架构,可以帮助用户轻松实现这一目标。 Spring Security为在多线程环境中使用Spring Security提供了低级抽象。实际上,这就是Spring Security与AsyncContext.start(Runnable)和Spring MVC异步集成集成的基础。

3)。 CSRF攻击: - 假设您的银行网站提供的表单允许将当前登录用户的资金转移到另一个银行帐户。例如,HTTP请求可能如下所示:

POST /transfer HTTP/1.1
Host: bank.example.com
Cookie: JSESSIONID=randomid; Domain=bank.abc.com; Secure; HttpOnly
Content-Type: application/x-www-form-urlencoded

amount=100.00&routingNumber=1234&account=9876

现在假装您在银行的网站上进行身份验证,然后在没有退出的情况下访问一个邪恶的网站。邪恶的网站包含一个HTML页面,其格式如下:

<form action="https://bank.example.com/transfer" method="post">
  <input type="hidden"
      name="amount"
      value="100.00"/>
  <input type="hidden"
      name="account"
      value="evilsAccountNumber"/>
  <input type="submit"
      value="ohh you Win Money!"/>
</form>

您想赢钱,所以点击提交按钮。在此过程中,您无意中将100美元转移给了恶意用户。发生这种情况是因为,虽然恶意网站无法看到您的Cookie,但与您的银行相关联的Cookie仍会随请求一起发送。

使用spring security 3.2可以轻松停止此类攻击,因为Spring安全性中的新功能跨站点请求伪造(CSRF)保护会生成一些在付款时匹配的令牌网关方面。

还有更多优点......................