Tim*_*Tim 12 ssl cas spring-boot angular
我使用Angular 5作为Spring Boot REST服务器的前端.如果不使用SSL,一切都正常.当我切换到SSL时,最终我得到了一切工作.它适用于GET请求,但到目前为止,我无法获得PUT请求.
我的猜测是,这是某种CORS问题,因为GET是一个简单的请求而PUT显然不是(CORS参考),但我无法弄清楚如何解决问题.
在我的Spring Boot Rest控制器上,我有注释@CrossOrigin("*"),所以我不认为这是问题,但我不确定.
另一个难题是通过CAS服务器处理身份验证.我已将以下配置添加到CAS属性中.这些是允许GET请求工作的最后一块,但我不确定要对它们进行哪些更改(如果有的话)来处理PUT请求:
cas.httpWebRequest.cors.enabled=true
cas.httpWebRequest.cors.allowOrigins[0]=*
cas.httpWebRequest.cors.allowMethods[0]=*
cas.httpWebRequest.cors.allowHeaders[0]=*
Run Code Online (Sandbox Code Playgroud)
这是我的请求标头和响应:
请求:
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.5
Connection: keep-alive
Content-Length: 1975
Content-Type: application/json
Cookie: JSESSIONID=117D9345E985D824E46…BF32; io=gLhCcBoZrfNcppioAAAB
Host: localhost:4200
Referer: https://localhost:4200/sales/proposals/dashboard
User-Agent: Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/57.0
Run Code Online (Sandbox Code Playgroud)
回应(状态代码 - 403禁止):
access-control-allow-origin: *
cache-control: no-cache, no-store, max-age=0, must-revalidate
content-length: 56
content-type: application/json;charset=UTF-8
date: Wed, 03 Jan 2018 16:39:14 GMT
expires: 0
pragma: no-cache
strict-transport-security: max-age=31536000 ; includeSubDomains
x-content-type-options: nosniff
X-Firefox-Spdy: h2
x-frame-options: DENY
x-powered-by: Express
x-xss-protection: 1; mode=block
Run Code Online (Sandbox Code Playgroud)
角度服务正在运行https://localhost:4200.
Spring启动服务正在运行https://localhost:8493.
CAS服务正在运行https://localhost:8443.
我在任何日志中都没有看到错误消息.我希望能够理解为什么禁止PUT请求,然后如何修复它以便PUT请求也可以工作.谢谢!
编辑:添加Spring Boot安全配置
<http pattern="/**" entry-point-ref="casEntryPoint">
<intercept-url pattern="/api/holidays" access="permitAll"/>
<intercept-url pattern="/api/unit**" access="permitAll"/>
<intercept-url pattern="/**" access="isAuthenticated()" />
<custom-filter ref="casAuthenticationFilter" before="CAS_FILTER"/>
<csrf/>
</http>
<global-method-security pre-post-annotations="enabled"/>
<!-- CAS Config -->
<beans:bean id="casEntryPoint" class="org.springframework.security.cas.web.CasAuthenticationEntryPoint">
<beans:property name="loginUrl" value="${cas.server.host.login_url}"/>
<beans:property name="serviceProperties" ref="serviceProperties"/>
</beans:bean>
<beans:bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties">
<beans:property name="service" value="${app.server.host.url}login/cas"></beans:property>
</beans:bean>
<beans:bean id="casAuthenticationFilter" class="org.springframework.security.cas.web.CasAuthenticationFilter">
<beans:property name="authenticationManager" ref="authenticationManager"/>
</beans:bean>
<beans:bean id="casAuthenticationProvider" class="org.springframework.security.cas.authentication.CasAuthenticationProvider">
<beans:property name="ticketValidator" ref="ticketValidator"></beans:property>
<beans:property name="serviceProperties" ref="serviceProperties"></beans:property>
<beans:property name="key" value="Key"></beans:property>
<beans:property name="authenticationUserDetailsService" ref="userDetailsWrapper"/>
</beans:bean>
<beans:bean id="userDetailsWrapper" class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
<beans:property name="userDetailsService" ref="userDetails"></beans:property>
</beans:bean>
<ldap-user-service id="userDetails"
server-ref="ldapServer"
group-search-base="ou=ERPGroups,OU=MyBusiness"
group-search-filter="(member={0})"
user-search-base="ou=SBSUsers,OU=Users,OU=MyBusiness"
user-search-filter="(sAMAccountName={0})" />
<ldap-server id="ldapServer" url="${ldap.urls}/${ldap.base}" manager-dn="${ldap.username}" manager-password="${ldap.password}" />
<beans:bean id="ticketValidator" class="org.jasig.cas.client.validation.Cas30ServiceTicketValidator">
<beans:constructor-arg value="${cas.server.host.url}"></beans:constructor-arg>
</beans:bean>
<authentication-manager alias="authenticationManager">
<authentication-provider ref="casAuthenticationProvider" />
</authentication-manager>
Run Code Online (Sandbox Code Playgroud)
编辑:添加角度代理配置
{
"/api": {
"target" : "https://localhost:8493",
"changeOrigin": true,
"secure" : false
}
}
Run Code Online (Sandbox Code Playgroud)
CORS 是由浏览器强制执行的,但在这种情况下,您会从服务器收到 403。正如其他人提到的,您的请求似乎缺少 CSRF 标头,这可能就是服务器拒绝您的请求的原因。我不知道为什么当您切换到 HTTPS 时会发生这种情况,但我可以告诉您<csrf/>配置中有但没有可匹配的标头。
要验证这一理论,您可以通过更改以下内容来禁用CSRF保护:
<csrf/>
Run Code Online (Sandbox Code Playgroud)
到:
<csrf disabled="true"/>
Run Code Online (Sandbox Code Playgroud)
从 Spring 4 开始,默认启用 CSRF 保护,因此仅删除<csrf/>是不够的。
一旦您确认 CSRF 是问题所在并且您不再收到 403 错误,您应该以Angular 支持的方式重新打开它。这是保护您的用户的重要保护措施。Angular 需要一个名为 cookie 的 cookie XSRF-TOKEN,它将与X-XSRF-TOKENheader 一起发回。这些是可配置的,但如果您使用最新的 Spring 和最新的 Angular,则应与 Spring 的默认值匹配。按照Spring文档添加:
<http>
<!-- ... -->
<csrf token-repository-ref="tokenRepository"/>
</http>
<b:bean id="tokenRepository"
class="org.springframework.security.web.csrf.CookieCsrfTokenRepository"
p:cookieHttpOnly="false"/>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1787 次 |
| 最近记录: |