2014-11-25 73 views
1

我想要的鉴别添加到我的RestController,但我不能找到任何好的文件或与Java配置任何样品。Spring安全方法级别安全与Java配置+ REST身份验证?

我试过,但它不工作(我可以访问,而无需登录的所有请求)

我的控制器都被注解@PreAuthorize

@RestController 
@RequestMapping("/api/hello") 
public class HelloController { 

    @RequestMapping(value = "/say", method = RequestMethod.GET) 
    public String sayHello() { 
     return "hello"; 
    } 

    @PreAuthorize("hasRole('ROLE_USER')") 
    @RequestMapping(value = "/say/user", method = RequestMethod.GET) 
    public String sayHelloWithUserProtection(){ 
     return "Hello USER"; 
    } 

    @PreAuthorize("hasRole('ROLE_ADMIN')") 
    @RequestMapping(value = "/say/admin", method = RequestMethod.GET) 
    public String sayHelloWithAdminrProtection(){ 
     return "Hello ADMIN"; 
    } 
} 

SecurityConfig

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
@ComponentScan(basePackages = {"com.test.server.security"}) 
public class SecurityConfig { 


    @Autowired 
    public void configureAuthentification(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
     .inMemoryAuthentication() 
       .withUser("user").password("password").roles("USER").and() 
       .withUser("admin").password("admin").roles("USER","ADMIN"); 
    } 

    @Configuration 
    public static class ApiWebConfigurerAdapter extends WebSecurityConfigurerAdapter { 

     @Override 
     protected void configure(HttpSecurity http) throws Exception { 
      http 
        .antMatcher("/api/**") 
        .formLogin(); 
     } 
    } 

} 

SecurityWebApplicationInitializer

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { 
} 

我该如何让它工作?

而有任何好的教程,使基于REST令牌(令牌,该令牌保存会话密钥和其他自定义值)与JPA(或JDBC?)与Java的配置保存在数据库认证?

回答

0

我忘了把我的WebApplicationInitialisation的问题。

我的错误是我把SecurityConfig在getRootConfigClasses()代替getServletConfigClasses的()。 现在WebApplicationInitialisation看起来像这样,它工作得很好!

public class WebApplicationInitialisation extends AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class[]{RootConfig.class}; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class[]{WebMvcConfig.class, SecurityConfig.class}; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[]{"/"}; 
    } 


    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     super.onStartup(servletContext); 
    } 
} 
+0

我不明白,你能详细解释一下吗?,我从web.xml开始我的Spring配置 – pazfernando 2015-11-27 00:08:19

2

降formLogin()。你需要保持REST应该是无状态的思维模式。用这种方式登录表单并不是纯粹的REST。你可以用这样的Spring安全链创建一个精美的蒙面过滤器(随机添加东西来创建一个更完整的过滤器,这意味着你需要在创建过滤器之前创建一个实际的过滤器。你需要他们匹配的路径之前,授权请求。

http.authorizeRequests() 
     .antMatchers("/login").permitAll() 
     .antMatchers("/say/user/").hasRole("USER") 
     .antMatchers("/say/admin").hasRole("ADMIN") 
     .anyRequest().authenticated(); 

上面的代码应该自我解释。如果没有,我会尽量详细说明就可以了。

至于基于令牌登录,这是一个好主意,但你不应该推出自己的。 春天有很好的Oauth支持和g Etting开始保护你的REST API,它非常棒。

本教程将详细解释它,并应该帮助您进一步构建更好的API。 http://spring.io/guides/tutorials/bookmarks/

另外,还要确保你看看福勒的著作就在这里休息 http://martinfowler.com/articles/richardsonMaturityModel.html

+0

感谢您的回答,我看着OAuth,我会让你知道的。 我发现本教程http://jaxenter.com/rest-api-spring-java-8-112289.html。 但是没有办法使用@PreAuthorize而不是antMatchers? (我认为它更容易维护) – alvinmeimoun 2014-11-25 12:44:25

+0

您可以同时使用,但我不会忽略antMatchers。 – scav 2014-12-02 13:44:53