2012-07-05 30 views
6

Tôi là người mới sử dụng Spring Security 3. Tôi đang sử dụng vai trò để người dùng đăng nhập.Cách thêm bộ lọc tùy chỉnh sau khi người dùng ủy quyền trong ứng dụng mùa xuân

Tôi muốn thêm một số giá trị phiên sau khi người dùng được ủy quyền vào ứng dụng. Có lẽ tôi cần một số bộ lọc để nó chuyển hướng đến phương pháp của tôi mà thêm một số giá trị phiên. Tôi đã cấu hình tệp security.xml của mình nhưng tôi không chắc liệu mình có đang làm đúng hay không. Bất kỳ ví dụ nào theo hướng đó sẽ hữu ích. Tôi nên sử dụng lớp bộ lọc nào? Tôi nên cấu hình tập tin security.xml như thế nào?

<custom-filter ref="authenticationFilter" after="FORM_LOGIN_FILTER "/> 

<beans:bean id="authenticationFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> 
    <beans:property name="filterProcessesUrl" value="/j_spring_security_check" /> 
    <beans:property name="authenticationManager" ref="authenticationManager" /> 
    <beans:property name="authenticationSuccessHandler" ref="successHandler" /> 
</beans:bean> 

<beans:bean id="successHandler" class="org.dfci.sparks.datarequest.security.CustomAuthorizationFilter"/> 

Phương pháp lớp bộ lọc của tôi tôi cần thêm một số giá trị phiên.

public class CustomAuthorizationFilter implements AuthenticationSuccessHandler { 

    @Override 
    public void onAuthenticationSuccess(HttpServletRequest request, 
      HttpServletResponse response, Authentication authentication) 
      throws IOException, ServletException { 
     Set<String> roles = AuthorityUtils.authorityListToSet(authentication 
       .getAuthorities()); 
     if (roles.contains("ROLE_USER")) { 
      request.getSession().setAttribute("myVale", "myvalue"); 
     } 
    } 
} 

Sửa Mã

tôi đã sửa đổi tập tin security.xml tôi và tập tin lớp

<custom-filter ref="authenticationFilter" after="FORM_LOGIN_FILTER "/> 
public class CustomAuthorizationFilter extends GenericFilterBean { 

    /* 
    * ServletRequestAttributes attr = (ServletRequestAttributes) 
    * RequestContextHolder.currentRequestAttributes(); HttpSession 
    * session=attr.getRequest().getSession(true); 
    */ 
    @Autowired 
    private UserService userService; 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 

     try { 
      chain.doFilter(request, response); 

        HttpServletRequest req = (HttpServletRequest) request; 
        HttpSession session = req.getSession(true); 
        Authentication authentication = SecurityContextHolder 
          .getContext().getAuthentication(); 
        Set<String> roles = AuthorityUtils 
          .authorityListToSet(authentication.getAuthorities()); 
        User user = null;     
         if (true) { 
          session.setAttribute("Flag", "Y"); 
         } 
      } 

     } catch (IOException ex) { 
      throw ex; 
     } 
    } 

} 

nào gọi mỗi URL. Có cách nào khác để gọi phương thức lọc chỉ một lần khi người dùng được xác thực không?

+0

Sự cố với mã ở trên là gì? Bạn không nhận được thuộc tính myValue phiên bên trong url thành công khi đăng nhập? –

+0

@SunilChavan: Nó gọi bộ lọc này trước khi người dùng được xác thực. – Raje

+0

Bạn có thể nói như thế nào? Xem (API) [http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/authentication/AuthenticationSuccessHandler.html] chi tiết. Nó nói rõ ràng sau khi xác thực thành công nó gọi phương thức onAuthenticationSuccess –

Trả lời

8

Cuối cùng tôi đã có thể giải quyết vấn đề của tôi. Thay vì sử dụng bộ lọc, tôi đã thêm trình xử lý chỉ yêu cầu đăng nhập thành công.

dòng sau được thêm vào trong security.xml

<form-login login-page="/" authentication-failure-url="/?login_error=1" default-target-url="/" always-use-default-target="false" 
     authentication-success-handler-ref="authenticationSuccessHandler"/> 
     <logout /> 

<beans:bean id="authenticationSuccessHandler" class="security.CustomSuccessHandler"/> 

Ngoài ra tôi đã thêm xử lý một tùy chỉnh mà thêm thuộc tính phiên.

package security; 

import java.io.IOException; 
import java.security.GeneralSecurityException; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.security.core.Authentication; 
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; 

public class CustomSuccessHandler extends 
      SavedRequestAwareAuthenticationSuccessHandler { 
    @Override 
    public void onAuthenticationSuccess(final HttpServletRequest request, 
      final HttpServletResponse response, final Authentication authentication) 
      throws IOException, ServletException { 
     super.onAuthenticationSuccess(request, response, authentication); 

     HttpSession session = request.getSession(true); 

     try { 
      if (CurrentUser.isUserInRole("USER")) { 
       session.setAttribute("Flag", "user"); 
      } 
     } catch (Exception e) { 
      logger.error("Error in getting User()", e); 
     } 
    } 

} 
+0

tôi đang gọi một chức năng phổ biến từ nghe, nhưng nó trở về ngoại lệ con trỏ null mà chạy jdbctemplate. – Zigri2612

+0

exce. Threadpoolexecutor không rõ nguồn – Zigri2612

0

Bạn có thể sử dụng bộ lọc standart java (ý tôi là triển khai giao diện Bộ lọc). Chỉ cần đặt nó sau khi lọc authentification trong web.xml (điều này có nghĩa là nó sẽ đi sau trong chuỗi bộ lọc và sẽ được gọi sau chuỗi bộ lọc bảo mật).

public class CustomFilter implements Filter{ 

    @Override 
    public void destroy() { 
     // Do nothing 
    } 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, 
      FilterChain chain) throws IOException, ServletException { 

      HttpServletRequest request = (HttpServletRequest) req; 

      Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 

      Set<String> roles = AuthorityUtils.authorityListToSet(authentication.getAuthorities()); 
      if (roles.contains("ROLE_USER")) { 
       request.getSession().setAttribute("myVale", "myvalue"); 
      } 

      chain.doFilter(req, res); 

    } 

    @Override 
    public void init(FilterConfig arg0) throws ServletException { 
     // Do nothing 
    } 

} 

Fragment của web.xml:

<!-- The Spring Security Filter Chain --> 
<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<!-- Pay attention to the url-pattern --> 
<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
    <!-- <dispatcher>FORWARD</dispatcher> 
<dispatcher>REQUEST</dispatcher> --> 
</filter-mapping> 

<!-- Your filter definition --> 
<filter> 
    <filter-name>customFilter</filter-name> 
    <filter-class>com.yourcompany.test.CustomFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>customFilter</filter-name> 
    <url-pattern>/VacationsManager.jsp</url-pattern> 
</filter-mapping> 
+0

Tôi chỉnh sửa ví dụ về nhiều trường hợp của bạn. – dimas

+0

Cảm ơn bạn đã đưa ra ví dụ. Tôi làm theo các bước tương tự như bạn đã đề cập. Tôi đã sửa đổi mã của tôi nhưng phương thức lọc đó gọi cho mỗi và mọi url. Có cách nào khác để gọi chỉ một lần khi người dùng được xác thực không? – Raje

+0

Nếu tôi hiểu chính xác, bạn nên đặt đúng mẫu url cho bộ lọc (ví dụ: trang đăng nhập /login.jsp). Trong bộ lọc trường hợp như vậy sẽ chặn chỉ yêu cầu cho trang đăng nhập của bạn. Đối với các bộ lọc url khác sẽ không thực thi. – dimas

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