Grails - Acegi, как перенаправить пользователя в другой домен во время аутентификации? - PullRequest
1 голос
/ 07 марта 2012

Я унаследовал приложение Grails, которое использует плагин Acegi 0.5.3.

Приложение может быть доступно через два совершенно разных URL-адреса, например app.domainone.com и app.domaintwo.com. Доменные имена соответствуют двум различным сообществам пользователей. Теперь мне поручено ограничить доступ пользователей только из домена, к которому они относятся. На данный момент пользователи могут посетить любой из доменов и войти в приложение.

Я имею некоторое представление о том, как работает Acegi, но не могу сказать, что я все это понимаю. Поэтому хотел спросить, как бы я смог этого добиться.

В идеальном случае, когда пользователь пытается войти в систему, я хотел бы перенаправить (при необходимости) в его «соответствующий» домен и автоматически войти в систему с указанными учетными данными. Однако для временного решения будет достаточно простого перенаправления на соответствующую страницу входа.

1 Ответ

0 голосов
/ 29 марта 2012

Здесь идет мой 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

        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...