печальный конец этой истории
Ну, как выясняется, метод 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 ролей.
Будем благодарны за любые мысли. Заранее спасибо.