光阴似箭催人老,日月如移越少年。
CAS 現在大多數SSO都是採用的CAS解決方案,樓主可以研究一下。
SSO 流程圖SSO 是利用 cookie 来实现的。简单来说就是登录之后将认证信息存放在 cookie 中。当有app请求时可以先在自己的应用中校验是否登录。如果未登录将跳转至认证系统,此时认证系统检测cookie訊息,如果有登入訊息,跳回請求系統。
cookie
app
多謝 @kevinz 的指點,我現在採用這樣的方式:
每個 APP 使用 Tomcat JDBCRealm 進行認證 (Authentication),但使用 Spring Security 進行授權。兩者基於相同的用戶資訊資料庫。
在 Tomcat 中開啟 SSO -- 這個很重要,否則訪問同一個域中其它 webapp 時,不會帶上 Cookie,也就無法認證了
在每個 webapp 中,設定 Web.xml 使用 Tomcat 進行認證 -- 如果用 Spring 進行認證,則 Tomcat 的 SSO 不起作用
在每個 webapp 中,配置 spring,使用 J2eePreAuthenticatedProcessingFilter,進行權限控制 (Authorization)
spring.xml 中的設定
<bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"> <constructor-arg name="strength" value="11" /> </bean> <bean id="forbiddenEntryPoint" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/> <security:http auto-config="false" use-expressions="true" entry-point-ref="forbiddenEntryPoint"> <security:custom-filter position="PRE_AUTH_FILTER" ref="preAuthFilter"/> <security:intercept-url pattern="/index/**" access="hasAnyRole('ROLE_SUPER')" /> <security:session-management session-fixation-protection="none"/> <security:csrf disabled="true"/> </security:http> <bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider"> <property name="throwExceptionWhenTokenRejected" value="true"/> <property name="preAuthenticatedUserDetailsService"> <bean id="userDetailsServiceWrapper" class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper"> <property name="userDetailsService" ref="nosUserDetailsService" /> </bean> </property> </bean> <bean id="preAuthenticatedProcessingFilterEntryPoint" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/> <bean id="webXmlMappableAttributesRetriever" class="org.springframework.security.web.authentication.preauth.j2ee.WebXmlMappableAttributesRetriever"/> <bean id="simpleAttributes2GrantedAuthoritiesMapper" class="org.springframework.security.core.authority.mapping.SimpleAttributes2GrantedAuthoritiesMapper"> <property name="attributePrefix" value=""/> </bean> <bean id="j2eeBasedPreAuthenticatedWebAuthenticationDetailsSource" class="org.springframework.security.web.authentication.preauth.j2ee.J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource"> <property name="mappableRolesRetriever" ref="webXmlMappableAttributesRetriever"/> <property name="userRoles2GrantedAuthoritiesMapper" ref="simpleAttributes2GrantedAuthoritiesMapper"/> </bean> <bean id="preAuthFilter" class="org.springframework.security.web.authentication.preauth.j2ee.J2eePreAuthenticatedProcessingFilter"> <property name="authenticationManager" ref="authenticationManager"/> <property name="authenticationDetailsSource" ref="j2eeBasedPreAuthenticatedWebAuthenticationDetailsSource"/> </bean> <security:authentication-manager alias="authenticationManager"> <security:authentication-provider ref="preauthAuthProvider"/> </security:authentication-manager>
CAS 現在大多數SSO都是採用的CAS解決方案,樓主可以研究一下。
SSO 流程圖
SSO 是利用
cookie
来实现的。简单来说就是登录之后将认证信息存放在cookie
中。当有app
请求时可以先在自己的应用中校验是否登录。如果未登录将跳转至认证系统,此时认证系统检测cookie
訊息,如果有登入訊息,跳回請求系統。多謝 @kevinz 的指點,我現在採用這樣的方式:
每個 APP 使用 Tomcat JDBCRealm 進行認證 (Authentication),但使用 Spring Security 進行授權。兩者基於相同的用戶資訊資料庫。
在 Tomcat 中開啟 SSO -- 這個很重要,否則訪問同一個域中其它 webapp 時,不會帶上 Cookie,也就無法認證了
在每個 webapp 中,設定 Web.xml 使用 Tomcat 進行認證 -- 如果用 Spring 進行認證,則 Tomcat 的 SSO 不起作用
在每個 webapp 中,配置 spring,使用 J2eePreAuthenticatedProcessingFilter,進行權限控制 (Authorization)
spring.xml 中的設定