2012-03-07 3 views
1

Acegi 0.5.3 플러그인을 사용하는 Grails 앱을 상속 받았습니다.Grails - Acegi, 인증 과정에서 사용자를 다른 도메인으로 리디렉션하는 방법은 무엇입니까?

완전히 다른 두 개의 URL (예 : app.domainone.com 및 app.domaintwo.com)을 통해 애플리케이션에 액세스 할 수 있습니다. 도메인 이름은 두 개의 서로 다른 사용자 커뮤니티에 매핑됩니다. 이제는 관련된 도메인에서만 사용자 액세스를 제한하는 임무가 주어졌습니다. 현재 사용자는 도메인을 방문하여 애플리케이션에 로그인 할 수 있습니다.

Acegi의 작동 방식에 대한 단서가 있지만 아직 모든 것을 이해하고 있다고 말할 수는 없습니다. 그래서 내가 어떻게이 일을 성취 할 수 있는지 묻고 싶었습니다.

사용자가 로그인을 시도 할 때 필요한 경우 해당 '관련'도메인으로 리디렉션하고 해당 자격 증명을 사용하여 자동 로그인합니다. 그러나 중간 솔루션으로도 관련 로그인 페이지로의 일반 리디렉션으로 충분합니다.

답변

0

여기 내 CustomAuthenticationProcessingFilter가 있습니다. 아마 거기에는 더 나은 해결책이 있지만 이것은 Grails와 Spring Security에 대한 지식을 가지고 도움이되었습니다.

class CustomAuthenticationProcessingFilter extends GrailsAuthenticationProcessingFilter implements 
    InitializingBean { 

     //def authenticationManager 
     @Override 
     public int getOrder() { 
      return FilterChainOrder.AUTHENTICATION_PROCESSING_FILTER 
     } 

     @Override 
     void doFilterHttp(HttpServletRequest request, 
     HttpServletResponse response, FilterChain chain) throws IOException, 
     ServletException { 
      if (SecurityContextHolder.getContext().getAuthentication() == null) { 
       def loginUrl = "${request.getRequestURL().toString() - request.getRequestURI().toString()}${request.contextPath}" 
       def username = request.getParameter("j_username") 
       def password = request.getParameter("j_password") 

       if (loginUrl && username && password) { 
        def user = User.findByEmailOrCompanyEmail(username,username) 
        if(user) { 
         def query = """select c from Community c, UserCommunity uc 
             where c.id = uc.comm.id 
             and uc.user.id = :userId""" 
         def comm = Community.executeQuery(query,[userId:user.id]) 
         comm = comm?(comm?.get(0)):null 
         if(loginUrl!=comm?.url) { 
          println "Trying to login using the wrong URL" 
          response.sendRedirect(comm.url+'/login/auth') 
          return 
         } 

        } 
       } 
      } 
//Resume the normal flow 
      super.doFilterHttp(request, response, chain) 
     } 

     @Override 
     public void afterPropertiesSet() throws Exception { 
      // TODO Auto-generated method stub 

     } 

    } 
관련 문제