Безопасность Grails Acegi: проблема с ролями и доступом - PullRequest
2 голосов
/ 23 декабря 2010

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

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

Проблема

Привет всем,

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

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

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

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

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

update

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

Роли проверяются в файле 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())
    }

}

обновление - подробный журнал и без комментариев /newlines

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

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

org.springframework.security.intercept.AbstractSecurityInterceptor - предварительно аутентифицированный: org.springframework.security.providers.Username.Uasstail.se.dedef.aude.aua.aude0:

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

Подробности: 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 ролей.

Будем благодарны за любые мысли. Заранее спасибо.

1 Ответ

0 голосов
/ 23 декабря 2010

EDIT -

из документации , 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 представляет собой многострочную строку (посмотрите на формат '' одна длинная строка ''), поэтому механизмы Acegi будут пытаться анализировать / использовать комментарии.

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