2014-09-16 7 views
1

У меня есть набор репозиториев данных Sping Data, которые подвергаются воздействию Rest, используя проект Spring-data-rest. Теперь я хочу, чтобы обеспечить HTTP, так что только зарегистрированные пользователи могут получить доступ к http://localhost:8080/rest/ Так что для этой цели я добавить @Secured(value = { "ROLE_ADMIN" }) ко всем хранилищам, и я также включить безопасность, указавSpring Security Rest

@EnableGlobalMethodSecurity(securedEnabled = true, jsr250Enabled = true, prePostEnabled = true) 

Так что теперь, что происходит, я переходите к остальным, и все в порядке - меня просят пройти аутентификацию. Следующее, что я делаю, я иду на мой сайт (который использует все репозитории для доступа к базе данных), но мой запрос не с

nested exception is org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext 

который является правильным, потому что я буду просматривать мой сайт как анонимный пользователь.

Итак, мой вопрос: существует ли способ обеспечить аутентификацию метода только для слоя REST? Мне кажется, что нужна новая аннотация (что-то вроде @EnableRestGlobalMethodSecurity или @EnableRestSecurity)

ответ

2

Я не знаю, сумеет ли это решить вашу проблему, однако мне удалось получить что-то похожее, работая для меня, создав обработчик событий для мой конкретный репозиторий, а затем использовал аннотацию @PreAuthorize для проверки разрешений, например, на beforeCreate. Например:

@RepositoryEventHandler(Account.class) 
public class AccountEventHandler { 

    private final Logger logger = LoggerFactory.getLogger(getClass()); 

    @PreAuthorize("isAuthenticated() and (hasRole('ROLE_USER'))") 
    @HandleBeforeCreate 
    public void beforeAccountCreate(Account account) { 
     logger.debug(String.format("In before create for account '%s'",  account.getName())); 
    } 

    @PreAuthorize("isAuthenticated() and (hasRole('ROLE_ADMIN'))") 
    @HandleBeforeSave 
    public void beforeAccountUpdate(Account account) { 
     logger.debug(String.format("In before update for account '%s'", account.getName())); 
    //Don't need to add anything to this method, the @PreAuthorize does the job. 
    } 
} 
Смежные вопросы