Spring Security OAuth2 pure resource server

后端 未结 2 1147
孤街浪徒
孤街浪徒 2021-02-01 06:46

We already have an OAuth2 authorization server set up, so I need to create a corresponding resource server (separate server). We plan to use the Spring Security OAuth2 project.

相关标签:
2条回答
  • 2021-02-01 07:00

    Yes its possible. Like you have already mentioned in your question, RemoteTokenServices is the solution.

    I have created one sample which has separate auth and resource server. Its just a sample to give a quick idea about the concept and open for extension.

    Spring-AngularJS-OAuth2-Sample

    0 讨论(0)
  • 2021-02-01 07:13

    This is possible as long as the authorization server and resource server(s) access a shared tokenStore (e.g. using JdbcTokenStore with a common dataSource). You can just use DefaultTokenServices with a reference to your shared tokenStore. Below is an example Spring config which you should be able to tweak to fit your needs:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:security="http://www.springframework.org/schema/security"
       xmlns:oauth2="http://www.springframework.org/schema/security/oauth2"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/security
        http://www.springframework.org/schema/security/spring-security-3.1.xsd
        http://www.springframework.org/schema/security/oauth2
        http://www.springframework.org/schema/security/spring-security-oauth2.xsd">
    
    <bean id="tokenStore" class="org.springframework.security.oauth2.provider.token.JdbcTokenStore">
        <constructor-arg name="dataSource" ref="dataSource" />
    </bean>
    
    <bean id="tokenServices" class="org.springframework.security.oauth2.provider.token.DefaultTokenServices">
        <property name="tokenStore" ref="tokenStore" />
    </bean>
    
    <bean id="authenticationEntryPoint" class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
        <property name="realmName" value="myRealm" />
    </bean>
    
    <bean id="oauthAccessDeniedHandler" class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" />
    
    <bean id="accessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased">
        <constructor-arg>
            <list>
                <bean class="org.springframework.security.oauth2.provider.vote.ScopeVoter" />
                <bean class="org.springframework.security.access.vote.RoleVoter" />
                <bean class="org.springframework.security.access.vote.AuthenticatedVoter" />
            </list>
        </constructor-arg>
    </bean>
    
    <!-- This is not actually used, but it's required by Spring Security -->
    <security:authentication-manager alias="authenticationManager" />
    
    <oauth2:expression-handler id="oauthExpressionHandler" />
    
    <oauth2:web-expression-handler id="oauthWebExpressionHandler" />
    
    <security:global-method-security pre-post-annotations="enabled" proxy-target-class="true">
        <security:expression-handler ref="oauthExpressionHandler" />
    </security:global-method-security>
    
    <oauth2:resource-server id="myResource" resource-id="myResourceId" token-services-ref="tokenServices" />
    
    <security:http pattern="/myPattern/**" create-session="never"
        entry-point-ref="authenticationEntryPoint" access-decision-manager-ref="accessDecisionManager">
        <security:anonymous enabled="false" />
        <security:intercept-url pattern="/**" access="SCOPE_READ" method="GET" />
        <security:intercept-url pattern="/**" access="SCOPE_READ" method="HEAD" />
        <security:intercept-url pattern="/**" access="SCOPE_READ" method="OPTIONS" />
        <security:intercept-url pattern="/**" access="SCOPE_WRITE" method="PUT" />
        <security:intercept-url pattern="/**" access="SCOPE_WRITE" method="POST" />
        <security:intercept-url pattern="/**" access="SCOPE_WRITE" method="DELETE" />
        <security:custom-filter ref="myResource" before="PRE_AUTH_FILTER" />
        <security:access-denied-handler ref="oauthAccessDeniedHandler" />
        <security:expression-handler ref="oauthWebExpressionHandler" />
    </security:http>
    </beans>
    
    0 讨论(0)
提交回复
热议问题