首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >angular 2,支持spring-boot安全rest api

angular 2,支持spring-boot安全rest api
EN

Stack Overflow用户
提问于 2017-03-27 13:01:36
回答 1查看 947关注 0票数 0

因为我想解耦工作,所以我把REST部署在Tomcat上(本地主机:8084,使用上下文路径app-api),前端部署在angular cli上(本地主机:4200)。

我的问题是,当我登录然后调用其他api,但结果是401。登录成功后,JSessionId不会保留并在第二个请求的头部中发送。

这是我的bean配置:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd
                    http://www.springframework.org/schema/security
                    http://www.springframework.org/schema/security/spring-security.xsd">
    <global-method-security />

    <beans:bean id="failureHandler" class="my.app.auth.RESTAuthenticationFailureHandler"></beans:bean>
    <beans:bean id="successHandler" class="my.app.auth.RESTAuthenticationSuccessHandler"></beans:bean>
    <beans:bean id="loginUrlAuthenticationEntryPoint" class="my.app.auth.RESTAuthenticationEntryPoint"></beans:bean>

    <beans:bean id="loginPathRequestMatcher" class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
        <beans:constructor-arg type="java.lang.String" value="/login" />
    </beans:bean> 

    <beans:bean id="customUsernamePasswordAuthenticationFilter"
        class="my.app.auth.AuthenticationFilter">
        <beans:constructor-arg ref="loginPathRequestMatcher"/>
        <beans:constructor-arg ref="environment"/>
        <beans:constructor-arg ref="httpClient"/>

        <beans:property name="authenticationManager" ref="authenticationManager" />
        <beans:property name="sessionAuthenticationStrategy" ref="session-management" />
        <beans:property name="authenticationFailureHandler" ref="failureHandler" />
        <beans:property name="authenticationSuccessHandler" ref="successHandler" />
    </beans:bean>

    <http auto-config="false" use-expressions="true"
        disable-url-rewriting="true" entry-point-ref="loginUrlAuthenticationEntryPoint">
        <csrf disabled="true" />
        <custom-filter position="FORM_LOGIN_FILTER"
            ref="customUsernamePasswordAuthenticationFilter" />
        <custom-filter after="FORM_LOGIN_FILTER" ref="concurrencyFilter" />

        <intercept-url pattern="/login" access="permitAll" />
        <intercept-url pattern="/" access="permitAll" />

        <intercept-url pattern="/api/**" access="hasAnyRole('ROLE_USER')" />

        <logout logout-success-url="/login" />

        <headers>
            <frame-options policy="SAMEORIGIN" />
            <hsts include-subdomains="true" disabled="false" />
            <header name="Access-Control-Allow-Origin" value="*"/>
            <header name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS, DELETE"/>
            <header name="Access-Control-Max-Age" value="3600"/>
            <header name="Access-Control-Allow-Headers" value="x-requested-with, authorization, Content-Type, *"/>
        </headers>

        <session-management
            session-authentication-strategy-ref="session-management" />
    </http>

    <beans:bean id="concurrencyFilter"
        class="my.app.auth.ConcurrentSessionFilter">
        <beans:constructor-arg ref="sessionRegistry" />
        <beans:constructor-arg name="expiredUrl" value="/" />
    </beans:bean>

    <beans:bean id="sessionRegistry" class="my.app.auth.SessionRegistry" />

    <beans:bean id="session-management"
        class="org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy">
        <beans:constructor-arg>
            <beans:list>
                <beans:bean
                    class="org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy">
                    <beans:constructor-arg ref="sessionRegistry" />
                </beans:bean>
                <beans:bean
                    class="org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy" />
                <beans:bean
                    class="org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy">
                    <beans:constructor-arg ref="sessionRegistry" />
                </beans:bean>
            </beans:list>
        </beans:constructor-arg>
    </beans:bean>

    <authentication-manager alias="authenticationManager">
        <authentication-provider ref="customAuthenticationProvider" />
    </authentication-manager>

    <beans:bean id="customAuthenticationProvider" class="my.app.auth.UserAuthProvider" />

    <beans:bean id="authenticationService" class="my.app.auth.AuthenticationService" />
</beans:beans>

我提到了angular2-spring-boot-security主题,但是我不能解决我的问题,或者我还不了解这个解决方案。

对我的问题有什么建议吗?或者和我讨论?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-03-28 10:20:02

谢谢大家。我通过精确声明Access-Control-Allow-Origin解决了我的问题。在config spring中使用withCredentials,在angular 2中使用http

代码语言:javascript
复制
        <header name="Access-Control-Allow-Origin" value="http://localhost:4200"/>
        <header name="withCredentials" value="true"/>
        <header name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, PATCH, DELETE"/>
        <header name="Access-Control-Max-Age" value="3600"/>
        <header name="Access-Control-Allow-Headers" value="*"/>
        <header name="Access-Control-Allow-Credentials" value="true"/>

并在组件的构造函数中添加http config:

代码语言:javascript
复制
constructor(private http: Http) {
    let _build = (<any>http)._backend._browserXHR.build;
    (<any>http)._backend._browserXHR.build = () => {
      let _xhr = _build();
      _xhr.withCredentials = true;
      return _xhr;
    };
  }

它可以很好地处理Get方法请求。但是现在我对Post方法的请求有了很大的问题。当我将Content-Type添加到头中时,请求不会从cookie中导入JSESSIONID,但是如果我不添加Content-Type,我会得到关于服务器的错误媒体类型的错误代码415。

我尝试过angular 2和XMLHttpRequestHttp。这是怎么回事?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43038276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档