无需身份验证的 Spring 安全授权
Posted
技术标签:
【中文标题】无需身份验证的 Spring 安全授权【英文标题】:Spring security authorization without authentication 【发布时间】:2014-05-24 11:33:32 【问题描述】:我有一个 Java JSF 2、Spring 3、Hibernate 4 Java EE 应用程序,它使用第三方库对用户进行身份验证。我将所需的 CA 证书导入到我的 JVM 中,将第三个库添加到项目中并在 web.xml 中进行配置。图书馆从智能卡中读取用户详细信息。整个设置工作正常,用户被第三方库带到主页。
这是我保护应用程序的要求。
再检查一次用户是否存在于应用程序特定的数据库中 从应用程序数据库中获取该用户的角色 保护我的 JSF 页面 保护我的应用服务我查看了这个链接,似乎“AuthenticationProcessingFilter”已被弃用,不适用于 Spring 3!
http://codersatwork.wordpress.com/2010/02/13/use-spring-security-for-authorization-only-not-for-authentication/
我也看过这个,但我不明白还需要什么其他步骤/配置。
spring-security: authorization without authentication
如果有人能概述一下我只需要通过授权实现 Spring Security 所需的所有项目,我将不胜感激。这就是我想出的。
1) 使用 spring 3 安全性更新 pom,添加一个过滤器(我应该选择哪个过滤器)
2) 自定义用户详细信息
3) 自定义 DaoAuthenticationProvider
4) 在 application-context.xml 中注册此自定义身份验证提供程序
5) 注册访问决策管理器以进行授权
【问题讨论】:
为什么不从智能卡中取出 CS 并将其传递给 Spring 以检查用户是否存在? 身份验证是通过第三方库完成的,该库检查公司 ldap 中的用户。其中“如果用户存在于特定于应用程序的数据库中,请再检查一次”是一项附加检查,不是强制性的。可以跳过。 智能卡和身份验证 Jar 如何通信?或者它是否可以在身份验证发生后可靠地将用户原则传递给网络服务器,例如通过 http 标头? 不涉及网络服务器。第三方身份验证库/jar 由公司的另一组提供。该库已添加到我的应用程序并部署到应用程序服务器。在访问应用程序的任何页面时,都会调用第三方的过滤器并调用第三方库中的验证码。然后,该库从通过 https 连接到桌面的读卡器中插入的智能卡中获取用户信息。一旦我登录(身份验证后)应用程序,我就会在请求对象中获得用户信息。 【参考方案1】:适合此用例的基本 Spring Security 类是 org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter 和 org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider。
如果您当前的身份验证库导致用户以标准 Java EE 方式进行身份验证(即对 HttpServletRequest 实例的 getUserPrincipal() 调用返回经过身份验证的用户的 Principal),您需要做的事情应该类似于:
-
实现接口 org.springframework.security.core.userdetails.UserDetailsService 检查用户是否存在于您的应用程序数据库中,如果不存在则抛出 UsernameNotFoundException
为 Spring Security 添加以下设置:
<!-- Declare the user details for database check -->
<bean id="userDetails" class="com.yourpackage.DatabaseUserDetails"/>
<!-- Default empty auth manager -->
<security:authentication-manager alias="authenticationManager"/>
<!-- Use default settings from the jee namespace -->
<security:http>
<security:jee mappable-roles="IS_AUTHENTICATED_FULLY" user-service-ref="userDetails"/>
</security:http>
配置您的 Spring Security 以根据您的要求执行授权
security:jee 初始化过滤器和身份验证提供程序,并将您的用户服务插入提供程序。
如果您当前的身份验证库不使用 Java EE 机制,您将需要实现自己的 AbstractPreAuthenticatedProcessingFilter 子类,它知道如何识别用户已通过身份验证。
然后您将使用自己的替换默认的预授权过滤器,因此配置如下所示:
<!-- Declare the user details for database check -->
<bean id="userDetails" class="com.yourpackage.DatabaseUserDetails"/>
<!-- Define provider -->
<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService">
<bean id="userDetailsServiceWrapper"
class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
<property name="userDetailsService" ref="userDetails"/>
</bean>
</property>
</bean>
<!-- Define alias for the authentication manager -->
<authentication-manager alias="authenticationManager">
<security:authentication-provider ref="preauthAuthProvider" />
</authentication-manager>
<!-- Declare the custom filter -->
<bean id="authenticationFilter" class="com.yourpackage.AuthenticationFilter">
<property name="authenticationManager" ref="authenticationManager"/>
</bean>
<security:http>
<security:custom-filter ref="authenticationFilter" position="PRE_AUTH_FILTER"/>
</security:http>
您可以在Spring Security documentation找到更多详细信息。
【讨论】:
我没有使用 JEE 容器,至少用于本地测试。验证我的应用程序的第三方库将带有 JSESSIONID 的 cookie 添加到请求标头。那么,我的 sping 安全应该是什么样子的呢?我注意到我在上面发布的示例链接中用于预认证的 spring-mvc。需要吗? 您最初的问题表明该应用程序是使用 JSF 构建的 Java EE - 如果您没有 JEE 容器,您将如何部署它?你不使用容器或应用程序服务器,如 Tomcat、Jetty、GlassFish、JBoss、Weblogic ......?身份验证模块在它创建的会话中留下哪些数据(并用 JSESSIONID 标识)?必须有某种方式来加载库验证的用户名(或其他标识符)。 Spring-MVC 不是必需的,您可以仅使用 Spring Security 处理整个预认证处理。 谢谢 vschafer。我使用 Tomcat 而不是 Tomcat EE 进行本地测试。我发布的两个链接确实使用了 JEE,我不确定第三方身份验证库是否使用 Java EE 机制。我将探讨您的建议“AbstractPreAuthenticatedProcessingFilter 的子类”。以下是我在第三方认证库认证后在请求头中看到的内容。 'host: xyzhost 用户代理: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Firefox/24.0 接受: text/html,application/xhtml+xml,application/xml; q=0.9,/;q=0.8 accept-language: en-US,en;q=0.5 accept-encoding: gzip, deflate cookie: JSESSIONID=D6C18D7B11A2DGDFDFDFBE; sid=ojddffdfdfdfdfdbfd0 连接:保持活动状态 库可能会在会话中留下一些内容(会话属性)。有关详细信息,您应该查阅该库的文档。以上是关于无需身份验证的 Spring 安全授权的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring 安全性中使用 rest 服务进行身份验证和授权 [关闭]