1

我们有一个使用 Spring Security 保护的 Spring Web 应用程序,并且一组 SOAP API 服务使用 Spring MVC 用于验证用户的相同安全域 @org.jboss.ejb3.annotation.SecurityDomain。

我们现在正在重构我们的应用程序并创建安全的 REST API。我们认为遵循以下方法

  • Spring @RestController 方法充当 REST APIS/webservices 来替换我们现有的soap API。
  • Spring OAuth2 保护 REST API
  • Spring MVC 继续使用 spring security 和 wildfly 服务器中定义的安全域,并且在表单登录后,一旦用户从 javascript/angular js 进行身份验证,使用 oauth 访问令牌来调用受保护的 REST API

弹簧配置

<http pattern="/restapi/**" entry-point-ref="oauthAuthenticationEntryPoint"
    create-session="stateless" xmlns="http://www.springframework.org/schema/security"
    use-expressions="true">
    <anonymous enabled="false" />
    <access-denied-handler ref="oauthAccessDeniedHandler" />
    <intercept-url pattern="/restapi/**" access="isAuthenticated()" />
    <remember-me key="myapp" services-ref="rememberMeServices" />
    <custom-filter ref="jbossSecurityFilter" after="REMEMBER_ME_FILTER" />
    <custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
</http>

<http pattern="/oauth/token" create-session="stateless"
    use-expressions="true" authentication-manager-ref="authenticationManager">
    <intercept-url pattern="/oauth/token" access="isAuthenticated()" />
    <anonymous enabled="false" />
    <custom-filter ref="clientCredentialsTokenEndpointFilter"
        before="BASIC_AUTH_FILTER" />
    <access-denied-handler ref="oauthAccessDeniedHandler" />
    <http-basic entry-point-ref="clientAuthenticationEntryPoint" />
    <remember-me key="myapp" services-ref="rememberMeServices" />
    <custom-filter ref="jbossSecurityFilter" after="REMEMBER_ME_FILTER" />
</http>

<beans:bean id="jaasAuthenticationProvider"     class="org.springframework.security.authentication.jaas.JaasAuthenticationProvider">
              <beans:property name="refreshConfigurationOnStartup" value="false"/> 
              <beans:property name="loginConfig" value="/WEB-INF/login.conf" />
              <beans:property name="loginContextName" value="AppName" />
              <beans:property name="callbackHandlers">
                 <beans:list>
                    <beans:ref bean="jaasNameCallBackHandler" />
                    <beans:bean class="org.springframework.security.authentication.jaas.JaasPasswordCallbackHandler" />
                 </beans:list>
              </beans:property>
              <beans:property name="authorityGranters">
                 <beans:list>
                    <beans:bean class="com.custom.CustomAuthorityGranter" />
                 </beans:list>
              </beans:property>
           </beans:bean>

第三方应用程序或 REST API 客户端将使用以下步骤获取访问令牌并访问受保护的 REST API

http://hostname:8080/myapp/oauth/token?grant_type=password&client_id=X&username=user1&password=secret&client_secret=XYZ&scope=read+write+trust

http://hostname:8080/myapp/restapi/getdata?access_token=5ec70b18-d9eb-449b-a1fa-d29c3d47274d

要求我们的 Web 服务客户端在请求参数/标头中发送他们的凭据以获取访问令牌是否安全?

这是将令牌保存在服务器会话中以在 UI 中用于 Spring MVC 请求的好方法吗?

我们还被要求考虑访问 REST API 的 API 密钥。通过使用 API 密钥,我们可以获得 ejb 会话上下文和用户详细信息吗?如果是这样,我们可以在 Web 部件中使用 API 密钥和 spring 安全性吗?

4

0 回答 0