Фон
Я использую плагин Spring Security Grails.Поскольку мои классы User и Role не являются объектами GORM, я заменил UserDetailsService
, предоставляемый плагином, на собственную реализацию:
class CustomUserDetailsService implements UserDetailsService {
static transactional = false
private static final log = LogFactory.getLog(this)
@Autowired
private UserManager userManager
@Autowired
private RoleManager roleManager
UserDetails loadUserByUsername(String username) {
User user = userManager.getUserByEmail(username)
UserDetails userDetails = new UserAdapter(user, roleManager)
log.debug "user '$username' has roles: ${userDetails.authorities?.authority}"
userDetails
}
}
Проблема
Когда я вхожу, ясм. следующее сообщение зарегистрировано от CustomUserDetailsService.loadUserByUsername()
пользователь 'a5511120@nepwk.com' имеет роли: [USER]
Так что, похоже, что пользователь былназначена роль ПОЛЬЗОВАТЕЛЯ.Тем не менее, когда я пытаюсь получить доступ к действию этого контроллера:
@Secured(['ROLE_USER', 'ROLE_ADMINISTRATOR'])
class MyProfileController {
def someAction = { // impl omitted }
}
, я получаю сообщение о том, что доступ запрещен.Я уверен, что пользователь вошел в систему, потому что на странице запрещенного доступа есть разметка, такая как
<sec:ifLoggedIn>
protected content
</sec:ifLoggedIn>
, и отображается защищенный контент.Таким образом, похоже, что роль USER не связана с текущим пользователем, когда выполняется авторизация контроллера.В сообщении журнала указывается, что UserDetailsService
в порядке.