如何使用Spring Security和Angularjs保护Spring Rest服务?

时间:2014-03-10 17:00:15

标签: angularjs rest authentication spring-mvc spring-security

我有一个带有Rest-Services的Spring MVC服务器后端和一个AngularJS WebFrontend。

我想保证我的春季mvc休息服务,但我想使用java配置..我不知道配置是如何配置的。有人可以帮我弄这个吗 ? 我发现的唯一好的实现是:https://github.com/philipsorst/angular-rest-springsecurity

我使用postgrsDB,并且我在那里存储用户名和密码以及角色,https://github.com/philipsorst/angular-rest-springsecurity示例中的会话令牌只存储在缓存中而不存储在数据库中?

目前我有一个简单的表单登录安全性,这只是用于测试,但我没有使用jsp我只使用spring mvc rest服务和angularjs作为webfrontend ..我怎么能修改我的spring安全代码呢与https://github.com/philipsorst/angular-rest-springsecurity中的示例一样使用oauth2吗?我目前只有春季安全的这两个班级。

@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {

        auth
        .inMemoryAuthentication()
        .withUser("username").password("test").roles("User");
    }
}

然后我在我的WebInitializer中注册securityConfig。

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

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

但是角色和用户名/密码应该存储在数据库中..我必须使用特殊的数据库模式来保证Spring安全性,以便在我的数据库中存储用户名,密码和角色吗?

我可以实现它,以便我只能在其中一个角色中添加@Secured Annotation(或任何其他注释)吗?喜欢@Secured(“UserRole”)

或者基本身份验证更容易吗?我可以通过角色管理进行基本身份验证来保障我的休息服务吗?如果是这样我们可以使用基本的身份验证.. 最好的问候

1 个答案:

答案 0 :(得分:0)

为了加载用户,您必须创建一个身份验证管理器并将UserDetailsS​​ervice连接到该身份验证管理器。以下文档链接概述了身份验证管理器以及相关的核心组件。

http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/#core-services

所以,回答你的第一个问题......

  

但角色和用户名/密码应存储在数据库中..我必须使用特殊的   用于Spring安全性的数据库模式,用于在我的数据库中存储用户名,密码和角色?

你可以做任何一件事。如果需要,Spring安全性可以为您处理所有数据库端,您只需提供对具有Spring架构设计的JDBC数据源的引用。

http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/#core-services-jdbc-user-service

http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/#appendix-schema

-OR -

您可以通过提供自己的UserDetailsS​​ervice实现来利用您自己的架构,该实现将从您自己的数据库架构加载。以下是一些可以帮助您开始使用该方法的示例。

<context:component-scan base-package="com.example.security" />
<security:global-method-security secured-annotations="enabled" pre-post-annotations="enabled"/>

<bean id="dao-provider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"
      p:userDetailsService-ref="myUserDetailsService"
      p:passwordEncoder-ref="sha-pw-encoder"
      p:saltSource-ref="my-salt-source" />

<bean id="sha-pw-encoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"
      p:encodeHashAsBase64="true" />

<bean id="my-salt-source" class="org.springframework.security.authentication.dao.ReflectionSaltSource"
      p:userPropertyToUse="salt" />

<security:authentication-manager>
    <security:authentication-provider ref="dao-provider"/>
</security:authentication-manager>

最后,提供UserDetailsS​​ervice的实现,如下所示:

@Component("myUserDetailsService")
public class MyUserDetailsServiceImpl implements UserDetailsService {

//Reference to the spring JPA repository for loading users
private final UserRepository userRepository;

@Autowired
public MyUserDetailsServiceImpl(UserRepository userRepository) {
    this.userRepository = userRepository;
}

@Override
@Transactional
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException         {
    User user = userRepository.findByName(username);
    if (user != null) {
        return new UserDetails() {
          ... //create the user details from the user object
        }
    } else {
        String err = String.format("Failed to find username: %s in local database.  Trying other auth mechanisms.", username);
        throw new UsernameNotFoundException(err);
    }
  }
}

...对于你的第二个问题:

  

我可以实现它,以便我只能添加@Secured Annotation(或任何其他   注释)我的其余一项服务中的角色是什么?喜欢@Secured(&#34; UserRole&#34;)

是的,上面的配置允许您通过配置global-method-security来使用@Secured注释。

最后,是的,默认情况下所有这些仍然会使用基本身份验证,但如果需要,可以重新配置为使用摘要身份验证。我建议您在http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/完整阅读文档,以便真正掌握您尝试做的事情。但是,这应该让你顺利。