没有认证的Spring安全授权

时间:2014-04-10 16:15:23

标签: java spring spring-security authorization

我有一个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 security更新pom,添加一个过滤器(我应该选择哪个过滤器)

2)自定义用户详细信息

3)自定义DaoAuthenticationProvider

4)在application-context.xml

中注册此自定义身份验证提供程序

5)注册访问决策管理员进行授权

1 个答案:

答案 0 :(得分:2)

适用于此用例的基本Spring Security类是org.springframework.security.web.authentication.preauth.Abs​​tractPreAuthenticatedProcessingFilter和org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider。

如果您当前的身份验证库导致用户以标准Java EE方式进行身份验证(即在HttpServletRequest实例上调用getUserPrincipal(),则返回经过身份验证的用户的Principal)您需要执行的操作应该类似到:

  1. 实现接口org.springframework.security.core.userdetails.UserDetailsS​​ervice,它检查用户是否存在于您的应用程序数据库中,如果不是
  2. 则抛出UsernameNotFoundException
  3. 为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>
    
  4. 配置Spring Security以根据您的要求执行授权

  5. 安全性: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中找到更多详情。