2014-01-12 46 views
0

使用弹簧webmvc和3.2版弹簧安全的web视图筑底,我想返回根据用户角色的不同观点(或者是否用户进行身份验证或没有),所以,对于"/"请求角色匿名(或不经过身份验证的用户的用户)获取欢迎页和作用用户的用户得到页。春季3.2:选择用户角色

我目前的做法与常规控制器这样做:

@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"); 
    } 
} 

回答

0

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

对Spring配置的一般支持被添加到Spring 3.1的Spring框架中。自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 Async Integration集成的基础。 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仍会与请求一起发送。

这种类型的攻击可以通过使用弹簧安全措施3轻松停止。2,因为这个新功能跨站点请求伪造(CSRF)保护在spring security中生成了一些在支付网关侧匹配的令牌。

和更多优点......................

+0

@Macias你对我的答案满意吗,对你来说看起来不错,我的朋友 – Tenacious

+0

@Macias如果它看起来不错,请注意它,所以它会对其他人有所帮助我的朋友 – Tenacious

+0

那么,从春季文档复制粘贴的确切位置是我的问题的答案? -1为我的朋友 – macias