Grails Spring Security: переключение между двумя ролями - PullRequest
1 голос
/ 21 июля 2011

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

Оцените пошаговый процесс, так как я действительно новичок в Grails.Любая подобная литература в сети с примером высоко ценится.

ОБНОВЛЕНИЕ: - WorkridersUser loadUserByUsername (String username, String roleName) бросает UsernameNotFoundException {// def conf = SpringSecurityUtils.securityConfig // Класс User = grailsApplication.getDomainClass ("Person") .clazz

    SchemeUser.withTransaction { status ->

        SchemeUser user = SchemeUser.findByUsername(username) 
        if (!user){ throw new UsernameNotFoundException('User not found', username)}

        UserProfile userProfile = UserProfile.findByEmail(user.username)
        Representative representative = Representative.findByUser(user)
        Organization organization = Organization.get(representative.organization.id)


        def authorities = user.authorities.collect {new GrantedAuthorityImpl(it.authority)}

        return new WorkridersUser(user.username, user.password, user.enabled, 
            !user.accountExpired, !user.passwordExpired, !user.accountLocked, 
            authorities ?: roleName, user.id, organization.companyName,userProfile) 
    } 
}

Спасибо

Шри

Ответы [ 2 ]

2 голосов
/ 26 июля 2011

вам необходимо переопределить метод loadUserByUsername следующим образом:

UserDetails loadUserByUsername(String username, String selectedRole) {
  // current selected role is stored in the member variable of the UserDetail class         
  this.selectedRole = selectedRole
  return loadUserByUsername(username)
}

, чтобы показать все роли текущего пользователя в поле выбора, напишите свой собственный тег lib, который должен выглядеть следующим образом:

def authorities = springSecurityService.principal.originalAuthorities
if (authorities.size() > 1) {
    out << "<form name='switchRoleForm' action='switchRole' method='post'>"
    out << "<select name='roles'>"
    Role tmpRole
    authorities.each {
        tmpRole = Role.findByAuthority(it.authority)
        // access your current select role
            if (springSecurityService.principal.selectedRole== it.authority)
            out << "<option selected value='${it.authority}'>${tmpRole.name}</option>"
        else
            out << "<option value='${it.authority}'>${tmpRole.name}</option>"
    }
    out << "</select>"
    out << '<input class="switch" type="submit" value="switch"/></span>'
    out << "</form>"        
}

Я описал логику переключения в предыдущем посте.

2 голосов
/ 21 июля 2011

Прежде всего вы должны реализовать свой собственный класс пользовательских данных и сервис.http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/index.html. В своем собственном UserDetailsService вы можете мотивировать свойство полномочия в методе loadUserByUsername, чтобы это свойство одновременно содержало только одну роль.затем вы можете переключаться между ролями, изменяя это свойство agian.например

// imagine the following code would be in your switch controller action
// fetch your user detail service bean (registered via resources.groovy and not as a service)
UserDetailsService userDetailsService = grailsApplication.mainContext.getBean("userDetailsService");
UserCache userCache = grailsApplication.mainContext.getBean("userCache");
// update authorities in user details. only one role should exists in authorities list
UserDetails userDetails = userDetailsService.loadUserByUsername(springSecurityService.principal.username, <place here the rolel to switch>);
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(),userDetails.getAuthorities()));
// refresh user detail
userCache.removeUserFromCache(springSecurityService.principal.username);
...