2011-08-11 53 views
5

Tôi mới sử dụng Spring và yêu cầu của tôi là tôi không muốn xác thực người dùng bằng tên người dùng và mật khẩu. Người dùng là xác thực là một số ứng dụng khác và ứng dụng của tôi nhận được yêu cầu với các chi tiết folloing:Bảo mật mùa xuân 3.0 - Cấp phép với xác thực

  1. User name
  2. Vai trò

Tôi chỉ muốn sử dụng Xuân An để bảo đảm các trang theo vai trò trong yêu cầu. Tôi đã đưa ra một suy nghĩ về cách viết UserDetailService, nhưng chỉ thêm dữ liệu yêu cầu, Spring vẫn yêu cầu thông tin xác thực. Sau đó, tôi nghĩ đến việc viết một cái gì đó như sau:

public class UserLogin { 

/* 
@Resource(name = "userDetailsService") 
private UserDetailsService userDetailsService; 
*/ 

@Resource(name = "authenticationManager") 
private AuthenticationManager authenticationManager; 

public boolean login(UserEntity user) { 

    //UserDetails ud = userDetailsService.loadUserByUsername(username); 

    Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
    for (String role : user.getAuthorities()) { 
     authorities.add(new GrantedAuthorityImpl(role)); 
    } 

    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword(), authorities); 

    try { 
     Authentication auth = authenticationManager.authenticate(token); 

     SecurityContext securityContext = new SecurityContextImpl(); 

     // Places in ThredLocal for future retrieval 
     SecurityContextHolder.setContext(securityContext); 
     SecurityContextHolder.getContext().setAuthentication(auth); 

    } catch (AuthenticationException e) { 
     return false; 
    } 

    return true; 
} 
} 

Tôi đi đúng hướng. Nếu vậy, làm thế nào để cấu hình toàn bộ điều .. trong spring-xml.

Trả lời

8

Bạn đang ở trong những gì được gọi là một kịch bản Pre-Authentication, nơi bạn cấu hình Spring Security để chỉ ủy quyền truy cập, không xác thực truy cập. Xem http://static.springsource.org/spring-security/site/docs/3.0.x/reference/preauth.html. Dưới đây là cấu hình đầy đủ, nơi bạn cần triển khai AbstractPreAuthenticatedProcessingFilter để grep chế độ xác thực của bạn UserPrincipal và tùy chỉnh UserDetailsService mà bạn đã đề cập ở trên.

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans 
xmlns:security="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-3.0.xsd 
        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"> 

<security:global-method-security secured-annotations="enabled" /> 

<beans:bean id="preAuthenticatedProcessingFilterEntryPoint" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint" /> 

<security:http auto-config="false" entry-point-ref="preAuthenticatedProcessingFilterEntryPoint"> 
    <security:custom-filter position="PRE_AUTH_FILTER" ref="myCustomPreAuthFilter" /> 
</security:http> 

<beans:bean id="myCustomPreAuthFilter" class="com.mypackage.MyCustomPreAuthFilter"> 
    <beans:property name="authenticationManager" ref="authenticationManager" /> 
</beans:bean> 

<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider ref="preauthAuthProvider" /> 
</security:authentication-manager> 

<beans:bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider"> 
    <beans:property name="preAuthenticatedUserDetailsService"> 
     <beans:bean id="userDetailsServiceWrapper" class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper"> 
      <beans:property name="userDetailsService" ref="myCustomUserDetailsService"/> 
     </beans:bean> 
    </beans:property> 
</beans:bean> 

Các vấn đề liên quan