分享

SpringSecurity2.0的简单SSO - pesome - ITeye技术网站

 wangxq 2011-06-16
 项目需要做一个简单的SSO到我们用SpringSecurity2.0的系统,因为没有统一的用户LDAP,采用post用户名密码的方式。现在要处理的就是2件事,一是能够post通过验证,二是验证通过要跳转到指定的页面。一很好实现: http://localhost:8081/j_spring_security_check?j_username=admin&j_password=1,采用的默认配置就可以通过验证。简单看一下spring源码,AuthenticationProcessingFilter是默认filterChain中的一个,由它来处理form方式的验证,验证代码如下:

 

Java代码 复制代码 收藏代码
  1. public Authentication attemptAuthentication(HttpServletRequest request) throws AuthenticationException {   
  2.         String username = obtainUsername(request);   
  3.         String password = obtainPassword(request);   
  4.   
  5.         if (username == null) {   
  6.             username = "";   
  7.         }   
  8.   
  9.         if (password == null) {   
  10.             password = "";   
  11.         }   
  12.   
  13.         username = username.trim();   
  14.   
  15.         UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);   
  16.   
  17.         // Place the last username attempted into HttpSession for views   
  18.         HttpSession session = request.getSession(false);   
  19.   
  20.         if (session != null || getAllowSessionCreation()) {   
  21.             request.getSession().setAttribute(SPRING_SECURITY_LAST_USERNAME_KEY, username);   
  22.         }   
  23.   
  24.         // Allow subclasses to set the "details" property   
  25.         setDetails(request, authRequest);   
  26.   
  27.         return this.getAuthenticationManager().authenticate(authRequest);   
  28.     }  
Java代码 复制代码 收藏代码
  1. protected String obtainUsername(HttpServletRequest request) {   
  2.         return request.getParameter(usernameParameter);   
  3.     }  
Java代码 复制代码 收藏代码
  1. public static final String SPRING_SECURITY_FORM_USERNAME_KEY = "j_username";   
  2.     public static final String SPRING_SECURITY_FORM_PASSWORD_KEY = "j_password";   
  3.     public static final String SPRING_SECURITY_LAST_USERNAME_KEY = "SPRING_SECURITY_LAST_USERNAME";  
Java代码 复制代码 收藏代码
  1.     private String usernameParameter = SPRING_SECURITY_FORM_USERNAME_KEY;   
  2.     private String passwordParameter = SPRING_SECURITY_FORM_PASSWORD_KEY;  
Java代码 复制代码 收藏代码
  1. public String getDefaultFilterProcessesUrl() {   
  2.         return "/j_spring_security_check";   
  3.     }  

 url中的3个参数代码中都出现了。

     第二个问题就复杂一点了,配置的默认页面是index.jsp,现在要跳转到其它页面。查不到文档,还是自己看源码。AuthenticationProcessingFilter extends了AbstractProcessingFilter,这个类有很多与配置对应的属性,一个我们需要的属性就是targetUrlResolver:

Java代码 复制代码 收藏代码
  1. private TargetUrlResolver targetUrlResolver = new TargetUrlResolverImpl();  

 这里就是处理验证后的跳转,看默认的TargetUrlResolverImpl类实现:

Java代码 复制代码 收藏代码
  1. public String determineTargetUrl(SavedRequest savedRequest, HttpServletRequest currentRequest,   
  2.             Authentication auth) {   
  3.   
  4.         String targetUrl = currentRequest.getParameter(targetUrlParameter);   
  5.            
  6.         if (StringUtils.hasText(targetUrl)) {   
  7.             try {   
  8.                 return URLDecoder.decode(targetUrl, "UTF-8");   
  9.             } catch (UnsupportedEncodingException e) {   
  10.                 throw new IllegalStateException("UTF-8 not supported. Shouldn't be possible");   
  11.             }   
  12.         }   
  13.   
  14.         if (savedRequest != null) {   
  15.             if (!justUseSavedRequestOnGet || savedRequest.getMethod().equals("GET")) {   
  16.                 targetUrl = savedRequest.getFullRequestUrl();   
  17.             }   
  18.         }   
  19.   
  20.         return targetUrl;   
  21.     }  

     这里targetUrl也是先getParameter,这意味着通过url参数指定跳转页面成为了可能

Java代码 复制代码 收藏代码
  1. public static String DEFAULT_TARGET_PARAMETER = "spring-security-redirect";   
  2.        
  3.     private String targetUrlParameter = DEFAULT_TARGET_PARAMETER;  

 找到了这个参数,spring-security-redirect,尝试url:

http://localhost:8081/j_spring_security_check?j_username=admin&j_password=1&spring-security-redirect=draft.do

 

验证通过并跳转到了相应的页面,这样没有增加代码和配置就完成了,也对SpringSecurity有了直观的认识。SpringSecurity也提供其它方式的sso,等有机会再好好研究。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多