Безопасность Grails Acegi: проблема с ролями и доступом

печальный конец этой истории

Как оказалось, метод compareTo в моем классе Role (Role реализует GrantedAuthority) всегда возвращал 0. Таким образом, у каждого пользователя была только одна роль (поскольку они хранятся в Set).

Проблема

Всем привет,

У меня странное поведение в моем приложении.

Я добавил пару полей в класс User (созданный Acegi), поэтому я могу установить пароль с истекшим сроком действия, записать последние N паролей и тому подобное. У нас есть 9 ролей, ROLE_ADMIN - это «суперпользователь», который может получить доступ ко всем функциям.

После развертывания приложения пользователи начали жаловаться, что не могут его использовать. Они могут войти в систему, но всякий раз, когда они хотят куда-то пойти, им отказывают в доступе, как если бы у них не было роли.

Это происходит с каждым пользователем, кроме администратора (имеет только ROLE_ADMIN), включая пользователей с (ROLE_ADMIN + другими ролями).

Я даже не могу подумать, с чего начать.

Обновить

Я проверил, и пользователь приходит из базы данных с прикрепленными ролями.

Роли проверяются в файле SecurityConfig.groovy. Боюсь, что проблема в другом, поскольку у меня есть версия проекта с тегами, которая действительно работает.

Вот мой SecurityConfig.groovy:

import com.mycompany.myapp.audit.Auditoria

security {

    // see DefaultSecurityConfig.groovy for all settable/overridable properties

    active = true

    loginUserDomainClass = "com.mycompany.myapp.user.User"
    authorityDomainClass = "com.mycompany.myapp.user.Role"
    requestMapClass = "com.mycompany.myapp.user.Requestmap"

    useRequestMapDomainClass = false

    /** authenticationEntryPoint */
    loginFormUrl = '/login/auth'
    forceHttps = 'false'
    ajaxLoginFormUrl = '/login/authAjax'
    authenticationFailureUrl = '/login/authfail'


    afterLogoutUrl = '/login/auth'

    requestMapString = """\
            CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
            PATTERN_TYPE_APACHE_ANT

            /=IS_AUTHENTICATED_REMEMBERED
            /login/auth=IS_AUTHENTICATED_ANONYMOUSLY
            /login/authajax=IS_AUTHENTICATED_ANONYMOUSLY
            /login/authfail=IS_AUTHENTICATED_ANONYMOUSLY
            /login/renew=IS_AUTHENTICATED_ANONYMOUSLY
            /js/**=IS_AUTHENTICATED_ANONYMOUSLY
            /css/**=IS_AUTHENTICATED_ANONYMOUSLY
            /images/**=IS_AUTHENTICATED_ANONYMOUSLY
            /plugins/**=IS_AUTHENTICATED_ANONYMOUSLY


            /scan/uploadfile=IS_AUTHENTICATED_ANONYMOUSLY
            /ticket/uploadfile=IS_AUTHENTICATED_ANONYMOUSLY
            /analisis/list =ROLE_SUP_TECNICO, ROLE_OP_TECNICO, ROLE_OP_FUNCIONAL, ROLE_ADMIN
            /analisis/hazzards/**=ROLE_SUP_TECNICO, ROLE_OP_TECNICO, ROLE_OP_FUNCIONAL, ROLE_ADMIN
            /analisis/show/**=ROLE_SUP_TECNICO, ROLE_OP_TECNICO, ROLE_ADMIN
            /analisis/create/**=ROLE_SUP_TECNICO, ROLE_ADMIN
            /analisis/edit/**=ROLE_SUP_TECNICO,ROLE_ADMIN
            /hazzardsreport/**=ROLE_SUP_TECNICO, ROLE_OP_TECNICO, ROLE_OP_FUNCIONAL, ROLE_REPORTE_VULNERABILIDAD, ROLE_ADMIN
            /mistaken/**=ROLE_SUP_TECNICO, ROLE_OP_TECNICO, ROLE_ADMIN
            /hazzardtype/**=ROLE_SUP_TECNICO, ROLE_ADMIN

            /** MODULO NORMAS */
            /report/**=ROLE_OP_FUNCIONAL, ROLE_ADMIN
            /norm/**=ROLE_OP_FUNCIONAL, ROLE_ADMIN

            /** TICKETS */
            /ticket/**=ROLE_SUP_TECNICO, ROLE_OP_TECNICO, ROLE_ADMIN
            /alert/**=ROLE_SUP_TECNICO, ROLE_OP_TECNICO, ROLE_ADMIN
            /ticket/uploadfile=IS_AUTHENTICATED_ANONYMOUSLY

            /** RISKS */
            /project/**=ROLE_AN_RIESGOS, ROLE_ADMIN
            /riskreport/**=ROLE_AN_RIESGOS, ROLE_ADMIN, ROLE_REPORTE_RIESGO

        /** BUSINESS CONTINUITY*/
            /projectpcn/**=ROLE_AN_PCN, ROLE_ADMIN
        /businessuniteval/** = ROLE_AN_PCN, ROLE_ADMIN
        /subprocesseval/** = ROLE_AN_PCN, ROLE_ADMIN
        /failscenario/**=ROLE_AN_PCN, ROLE_ADMIN
        /strategy/**=ROLE_AN_PCN, ROLE_ADMIN
        /test/**=ROLE_AN_PCN, ROLE_ADMIN
        /reportepcn/**=ROLE_AN_PCN, ROLE_ADMIN, ROLE_REPORTE_PCN
        /process/**=ROLE_AN_PCN, ROLE_ADMIN


        /** ADMIN */
            /user/changeent=IS_AUTHENTICATED_REMEMBERED
            /user/finduser=IS_AUTHENTICATED_REMEMBERED
            /user/**=ROLE_ADMIN
            /role/**=ROLE_ADMIN
            /requestmap/**=ROLE_ADMIN
        /empresa/**=ROLE_ADMIN
        /asset/**=ROLE_ADMIN, ROLE_SUP_TECNICO, ROLE_OP_TECNICO
        /responsable/**=ROLE_ADMIN
        /preference/**=ROLE_ADMIN
        /businessunit/**=ROLE_ADMIN, ROLE_AN_PCN


            /**=IS_AUTHENTICATED_REMEMBERED
        """


    useSecurityEventListener = true

    onInteractiveAuthenticationSuccessEvent = { e, appCtx ->
        Auditoria.log(e.getSource().getPrincipal().getDomainClass(), "Usuario autenticado - " + e.getSource().getDetails().getRemoteAddress())
    }

}

update - подробность лога и отсутствие комментариев / новых строк

Привет, после обновления моего SecurityConfig.groovy ошибка продолжается. Однако я извлек эту строку журнала. Я попытался получить доступ к /norm/index с пользователем, которому назначены все 9 ролей.

DEBUG 28 / Dec / 2010 00: 12: 57,110 [http-8080-3] Защищенный объект: FilterInvocation: URL: / norm / index; ConfigAttributes: [ROLE_OP_FUNCIONAL, ROLE_ADMIN]

org.springframework.security.intercept.AbstractSecurityInterceptor - Ранее аутентифицированный: org.springframework.security.providers.UsernamePasswordAuthenticationToken@a00c7ad6: Принципал: com.baufest.insside.security.UserLoginDetails

Имя пользователя: someuser; Пароль защищен]; Включено: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Полномочия: ROLE_OP_TECNICO; Пароль защищен]; Проверено: верно;

Подробности: org.springframework.security.ui.WebAuthenticationDetails@0: Полномочия: ROLE_OP_TECNICO

DEBUG 28 / Dec / 2010 00: 12: 57,110 [http-8080-3] org.springframework.security.ui.ExceptionTranslationFilter - Доступ запрещен (пользователь не анонимен); делегирование AccessDeniedHandler

Из того, что я здесь читал, похоже, что мой пользователь получает только 1 роль, хотя, когда я отлаживаю его, user.authorities имеет все 9 назначенных ему ролей.

Любые мысли будут оценены заранее.


person Tom    schedule 23.12.2010    source источник
comment
Что-нибудь в журнале приложений? Включены ли у вас правильные журналы? У вас есть SecurityFilters.groovy, что там?   -  person Victor Sergienko    schedule 24.12.2010
comment
попробуйте убрать комментарии из requestMapString. Выделите также новые строки.   -  person hvgotcodes    schedule 27.12.2010
comment
Я имел в виду дополнительные символы новой строки, а не все новые строки. Ставьте по одной записи в строке. Кроме того, по какому URL вы пытаетесь перейти при входе в систему как обычный пользователь ... Наконец, в вашем Config.groovy включите ведение журнала на уровне отладки в пакете org.springframework.security.   -  person hvgotcodes    schedule 27.12.2010


Ответы (1)


РЕДАКТИРОВАТЬ --

из документации requestMapString должен иметь вид

requestMapString = '''CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 
                      PATTERN_TYPE_APACHE_ANT 
                      /login/**=IS_AUTHENTICATED_ANONYMOUSLY 
                      /admin/**=ROLE_USER
                      /book/test/**=IS_AUTHENTICATED_FULLY
                      /book/**=ROLE_SUPERVISOR
                   '''

несколько примечаний:

1) У вас есть дополнительные символы новой строки и комментарии в строке карты запроса. RequestMapString - это многострочная строка (посмотрите на '' 'одну длинную строку' '' format), поэтому механизмы Acegi попытаются проанализировать / использовать комментарии.

person hvgotcodes    schedule 23.12.2010
comment
Что вы имеете в виду, говоря о правильной проверке ролей? Я написал сопоставления в SecurityConfig.xml - person Tom; 23.12.2010
comment
@tom, что вы имеете в виду, вы «написали сопоставления» в SecurityConfig.xml. Это должен быть SecurityConfig.groovy. Кроме того, проверки уровня URL-адреса в этом сопоставлении связаны только с тем, защищена ли вообще конечная точка. Вы по-прежнему можете программно проверять роли в ваших действиях / методах обслуживания. Поскольку вы предоставили не так много информации, мне пришлось сделать предположения о том, как вы использовали acegi. - person hvgotcodes; 23.12.2010
comment
@hvgotcodes Извините, я имел в виду SecurityConfig.groovy. Программной проверки у меня не было, я думал, что это все, что мне нужно. - person Tom; 23.12.2010
comment
@hvgotcodes Я попытался удалить ненужные символы новой строки и комментарии, но все еще не могу получить доступ. Как ни странно, есть продуктивная копия предыдущей версии этого файла (с комментариями и символами новой строки). - person Tom; 27.12.2010
comment
@tom, ты удалил комментарии? Вы сделали регистрацию в целях безопасности. - person hvgotcodes; 27.12.2010
comment
@tom, к какому URL-адресу вы пытаетесь получить доступ? - person hvgotcodes; 27.12.2010
comment
@tom, это вся ваша конфигурация безопасности? Вы настроили какие-либо избиратели / фильтры? - person hvgotcodes; 27.12.2010
comment
@hvgotcodes: Нет. Это печальный день, я решил его, но где-то в другом месте произошла ужасная ошибка. - person Tom; 28.12.2010