печальный конец этой истории
Как оказалось, метод 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 назначенных ему ролей.
Любые мысли будут оценены заранее.