2012-03-28 28 views
10

Khách hàng muốn có kịch bản sau:PreAuthentication with Spring Security -> Dựa trên thông số URL

Khách hàng đưa ra liên kết (địa chỉ webapp) với 2 tham số cho người dùng webapp. Dựa trên các biến này, người dùng sẽ thực hiện các vai trò cụ thể trong webapp. Tôi không muốn bất kỳ sự cho phép nào trong đó. Chỉ nên có kiểm tra xác thực xem các tham số url này và kiểm tra xem chúng có hợp lệ không và sẽ kết nối người dùng với vai trò thích hợp.

Làm thế nào tôi có thể nhận ra điều này ?! Đã có giải pháp sẵn có chưa?

Cảm ơn!

liên quan Matthias

Trả lời

20

Tôi đã giải quyết được sự cố. Đối với những người quan tâm ....

web.xml

<!-- ===== SPRING CONFIG ===== --> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 

<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/applicationContext.xml 
     /WEB-INF/applicationContext-security.xml 
    </param-value> 
</context-param> 

applicationContext.xml

<context:component-scan base-package="at.beko.rainstar2" /> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

applicationContext-security.xml

<!-- Configuring security not finished!! --> 
<http create-session="never" use-expressions="true" auto-config="false" 
    entry-point-ref="preAuthenticatedProcessingFilterEntryPoint"> 
    <intercept-url pattern="/authError.xhtml" access="permitAll" /> 
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> 
    <custom-filter position="PRE_AUTH_FILTER" ref="preAuthFilter" /> 
    <session-management session-fixation-protection="none" /> 
</http> 

<beans:bean id="userDetailsServiceImpl" 
    class="at.beko.rainstar2.service.impl.UserDetailsServiceImpl" /> 

<beans:bean id="preAuthenticatedProcessingFilterEntryPoint" 
    class="at.beko.rainstar2.model.LinkForbiddenEntryPoint" /> 

<beans:bean id="preAuthenticationProvider" 
    class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider"> 
    <beans:property name="preAuthenticatedUserDetailsService" 
     ref="userDetailsServiceImpl" /> 
</beans:bean> 

<beans:bean id="preAuthFilter" 
    class="at.beko.rainstar2.service.filter.UrlParametersAuthenticationFilter"> 
    <beans:property name="authenticationManager" ref="appControlAuthenticationManager" /> 
</beans:bean> 

<authentication-manager alias="appControlAuthenticationManager"> 
    <authentication-provider ref="preAuthenticationProvider" /> 
</authentication-manager> 

LinkForbiddenEntryPoint.java

public class LinkForbiddenEntryPoint implements AuthenticationEntryPoint { 

@Override 
public void commence(HttpServletRequest request, 
     HttpServletResponse response, AuthenticationException authException) 
     throws IOException, ServletException { 
    HttpServletResponse httpResponse = (HttpServletResponse) response; 
    httpResponse.sendRedirect("/rainstar2-webapp/authError.xhtml"); 
} 

}

UrlParametersAuthenticationFilter.java

public class UrlParametersAuthenticationFilter extends 
    AbstractPreAuthenticatedProcessingFilter { 

@Override 
protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) { 
    if (request.getParameterMap().size() == 2) { 
     return true; 
    } 
    return false; 
} 

@Override 
protected Object getPreAuthenticatedCredentials(HttpServletRequest request) { 
    String[] credentials = new String[2]; 
    credentials[0] = request.getParameter("param1"); 
    credentials[1] = request.getParameter("param2"); 
    return credentials; 
} 

}

UserDetailsServiceImpl.java

@SuppressWarnings("deprecation") 
public class UserDetailsServiceImpl implements 
    AuthenticationUserDetailsService<Authentication> { 

@Override 
public UserDetails loadUserDetails(Authentication token) 
     throws UsernameNotFoundException { 
    UserDetails userDetails = null; 

      String[] credentials = (String[]) token.getPrincipal(); 
    boolean principal = Boolean.valueOf(token.getCredentials().toString()); 

    if (credentials != null && principal == true) { 
     String name = credentials[0]; 
     if ("admin".equalsIgnoreCase(name)) { 
      userDetails = getAdminUser(name); 
     } else if ("händler".equalsIgnoreCase(name)) { 
      userDetails = getRetailerUser(name); 
     } else if ("user".equalsIgnoreCase(name)) { 
      userDetails = getUserUser(name); 
     } 
    } 

    if (userDetails == null) { 
     throw new UsernameNotFoundException("Could not load user : " 
       + token.getName()); 
    } 

    return userDetails; 
} 

private UserDetails getAdminUser(String username) { 
    Collection<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>(); 
    grantedAuthorities.add(new GrantedAuthorityImpl("ROLE_USER")); 
    grantedAuthorities.add(new GrantedAuthorityImpl("ROLE_RETAILER")); 
    grantedAuthorities.add(new GrantedAuthorityImpl("ROLE_ADMIN")); 
    return new User(username, "notused", true, true, true, true, 
      grantedAuthorities); 
} 

private UserDetails getRetailerUser(String username) { 
    Collection<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>(); 
    grantedAuthorities.add(new GrantedAuthorityImpl("ROLE_USER")); 
    grantedAuthorities.add(new GrantedAuthorityImpl("ROLE_RETAILER")); 
    return new User(username, "notused", true, true, true, true, 
      grantedAuthorities); 
} 

private UserDetails getUserUser(String username) { 
    Collection<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>(); 
    grantedAuthorities.add(new GrantedAuthorityImpl("ROLE_USER")); 
    return new User(username, "notused", true, true, true, true, 
      grantedAuthorities); 
} 

}

+0

tôi đang cố gắng t o thực hiện giải pháp của bạn nhưng tôi nhận được đúng trong lớp UserDetailsServiceImpl tại String [] credentials = (String []) token.getPrincipal(); Instated tôi sẽ nhận được các thông tin. – focode

+0

Bài viết liên quan này đã giúp tôi triển khai thishttps: //stackoverflow.com/questions/12478589/springsecurity-custom-automatic-authentication – encastellano

2

Cách tôi đã giải quyết vấn đề này với các tình huống tương tự là sử dụng bộ lọc servlet để lấy thông số. Tôi khuyên bạn nên mở rộng org.springframework.web.filter.GenericFilterBean.

Từ các tham số này, tạo đối tượng auth của một số loại (chẳng hạn như mã thông báo), có thể được chuyển vào AuthenticationManager mà bạn có thể tự động điền (hoặc nhận một số phương thức khác).

Sau đó, bạn sẽ cần có Trình xác thực có thể xử lý đối tượng auth của bạn và tạo đối tượng UserDetails bằng bộ sưu tập GrantedAuthority bạn cần đáp ứng các vai trò cụ thể mà bạn muốn người dùng có.

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