Как включить аннотацию @Secured на моих контроллерах, используя spring-security-pac4j 2.0

Я кодировал интеграцию моего веб-приложения, используя spring-security с pac4j и CAS на основе https://github.com/pac4j/spring-security-pac4j-demo, со следующими зависимостями:

compile "org.pac4j:pac4j-core:1.8.8"
compile "org.pac4j:pac4j-cas:1.8.8"
compile "org.pac4j:spring-security-pac4j:1.4.3"
compile "org.springframework.security:spring-security-core:4.1.0.RELEASE"

Тем не менее, когда я попытался обновить версию Spring-security-pac4j до версии 2.0.0, я понял, что подход полностью изменился. Прежде чем я использовал для загрузки пользовательских ролей в моем настроенном классе UserDetailService:

@Component("userDetailsService")
public class UserDetailsService implements AuthenticationUserDetailsService<ClientAuthenticationToken>  {

    private final Logger log = LoggerFactory.getLogger(UserDetailsService.class);

    @Inject
    private UserRepository userRepository;


    @Override
    @Transactional
    public UserDetails loadUserDetails(ClientAuthenticationToken token) throws UsernameNotFoundException {
        String username = token.getUserProfile().getId().toLowerCase();
        log.debug("Authenticating {}", username);

        Optional<User> userFromDatabase = userRepository.findOneByUsername(username);
        if (!userFromDatabase.isPresent()) {
            throw new UsernameNotFoundException("User " + username + " was not found in the database");
        } else if (!userFromDatabase.get().getActivated()) {
            throw new UserNotActivatedException("User " + username + " was not activated");
        }

        Collection<GrantedAuthority> grantedAuthorities = new ArrayList<>();
        for (Authority authority : userFromDatabase.get().getAuthorities()) {
            GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(authority.getName());
            grantedAuthorities.add(grantedAuthority);
        }
        return new org.springframework.security.core.userdetails.User(username,username, grantedAuthorities);
    }
}

И с некоторыми дополнительными конфигурациями Spring-Security работала для проверки доступа к ролям пользователей на моих контроллерах, помеченных @Secured.

@Controller
@RequestMapping("/app/*")
public class SecureController {

    @Secured("ROLE_ADMIN")
    @RequestMapping("/secure/admins")
    public String admins(Model model) {
        model.addAttribute("roleName", "ROLE_ADMIN");
        return "secure";
    }

    @Secured("ROLE_USER")
    @RequestMapping("/secure/users")
    public String users(Model model) {
        model.addAttribute("roleName", "ROLE_USER");
        return "secure";
    }
}

С версией 2.0.0 spring-security-pac4j, даже смотря в демоверсии, я все еще не знаю, с чего начать, чтобы обновить мой проект новой версией pac4j и сохранить его в работе с аннотацией @Secured. Если кто-то может помочь с любыми советами и / или указаниями, будет принята с благодарностью.

1 ответ

Я создатель pac4j и spring-security-pac4j.

Да, версия 2.0 действительно отличается, но это было необходимо, чтобы воспользоваться всеми функциями pac4j.

После успешной аутентификации CAS, CasProfile создается и сохраняется в вашем контексте безопасности (в Pac4jAuthentication маркер). Чтобы вычислить конкретные роли для вашего профиля (например, выбрав их из базы данных), вам нужно создать новую AuthorizationGenerator и прикрепить его к клиенту: casClient.addAuthorizationGenerator(myAuthGenerator);

Другие вопросы по тегам