2016-03-26 2 views
0

Мне нужно предоставить доступ на основе ролей для моих API REST, и я видел, что для этого мы можем использовать @PreAuthorize, @Secured. Однако я не уверен, какие изменения я должен внести и получить это место, поскольку в настоящее время я использую custom token based authentication mechanism для создания токена для сеанса и обрабатывать его сам.Как интегрировать Spring Security для доступа к URL-адресам на основе ролей

@RequestMapping(value = "login", method = RequestMethod.POST) 
     public @ResponseBody Result login(@RequestBody Credentials credentials) { 
     return loginService.login(credentials.getUsername(), credentials.getPassword()); 
     } 

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

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

Например, если я хочу, чтобы ограничить API findById быть доступны пользователем, только если он является частью из ADMIN_ROLE, то мне придется добавить аннотацию PreAuthorize, но я не уверен, как это определит роль пользователя и заблокирует пользователя автоматически.

@PreAuthorize("ADMIN_ROLE") 
@RequestMapping(value = "{id}", method = RequestMethod.GET) 
public @ResponseBody Group findById(@PathVariable int id) { 
    return groupParser.getGroupById(id, groupService.getGroupTree()); 
} 
+0

Я обрабатывать пользовательский маркер проверки подлинности на основе @RequestMapping (значение = "Войти", метод = RequestMethod.POST) общественного @ResponseBody Результат авторизации (@RequestBody Полномочия мандатной) { возврата loginService.login (credentials.getUsername (), credentials.getPassword()); } –

+0

, пожалуйста, вместо объяснения конфигурации отправьте его :-) У вас будет гораздо более точный ответ, если вы так и сделаете. –

+0

Спасибо @StefanoCazzola. Я внес некоторые изменения и добавил дополнительную информацию. –

ответ

1

Что вам нужно сделать, это настроить конфигурацию Spring Security. Ниже пример с конфигурацией XML (я гораздо более привык к нему); однако это можно сделать и в JavaConfig.

В принципе, Spring безопасности обжигают элементом

<http ....> 
... 
</http> 

. Вам нужно написать это так (или что-то подобное)

<beans:bean id="authenticatedVoter" class="org.springframework.security.web.access.expression.WebExpressionVoter"> 
     <beans:property name="expressionHandler" ref="..." /> 
</beans:bean> 

<beans:bean id="roleVoter" 
     class="org.springframework.security.access.vote.RoleVoter"> 
     <beans:property name="rolePrefix" value="" /> <!-- if you want to customize role prefix --> 
</beans:bean> 

<beans:bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased"> 
     <beans:constructor-arg> 
       <beans:list> 
         <beans:ref bean="roleVoter" /> 
         <beans:ref bean="authenticatedVoter" /> 
       </beans:list> 
     </beans:constructor-arg> 
</beans:bean> 

<!-- use-expressions enables the @PreAuthorize --> 
<http use-expressions="true" access-decision-manager-ref="accessDecisionManager"> 
.... 
</http> 

Примечание бобы добавляют: они три компонента Spring.

Первый содержит неуказанную ссылку. Он ожидает, что-то реализующее SecurityExpressionHandler: в вашем случае вы должны будете предоставить DefaultMethodSecurityExpressionHandler

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

public class MyClientAuthenticationFilter extends OncePerRequestFilter { 
    .... 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { 
     // custom logics here 
     // throw exception for not authenticated 
    } 
} 

, а затем подключить его

<bean class="x.y.z.MyClientAuthenticationFilter" id="myClientAuthenticationFilter" /> 
<http ....> 
    <custom-filter ref="myClientAuthenticationFilter" before="BASIC_AUTH_FILTER" /> 
</http> 

Вы должны быть в основном сделано.

Просто не забудьте включить в вашу сборку spring-security-aspects: Весенняя безопасность @PreAuthorize и другие аннотации перехватываются через АОП, поэтому вам нужно будет предоставить эти аспекты в своем пути к классам.

Кроме того, имейте в виду, что это не полная конфигурация: требуется длинное сообщение длиной , чтобы подключить все: это пример того, как начать.

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

Последнее примечание: если вы используете JvaConfig вместо XML, должны быть аннотации, которые могут избавить вас от части конфигурации, но настраиваемого фильтра.

Надеюсь, что это поможет.

+0

Спасибо Стефано за подсказку. Я настраиваю конфигурационную среду java именно на основе вашей конфигурации xml и интегрировал функции безопасности для моего приложения. Еще одна вещь, которую я сделал, это то, что я добавил фильтр в свое приложение, которое добавляет аутентификацию в SecurityContextHolder.getContext, поскольку я использовал аутентификацию на основе токена, а для следующего вызова состояние потеряно, и мне нужно перестроить состояние, чтобы @PreAuthorize работал хорошо. –

 Смежные вопросы

  • Нет связанных вопросов^_^