2016-04-26 4 views
2

Приложение, которое у меня есть в работах, использует Grails 3. Я пытаюсь выполнить предварительную проверку подлинности, как описано в этом article, но мне трудно, поскольку я не могу понять, как отключить обычную аутентификацию, предоставленную grails 3 spring security plugin.Grails 3 Spring Security Pre Authentication

Вот мой текущий сценарий: Пользователь A попадает на мою веб-страницу. Я хочу проанализировать заголовки запроса и вынуть роли и имя пользователя. Если имя пользователя или роли пустые, я перенаправляю пользователя на какой-либо шлюз. Проще говоря, я хочу использовать весеннюю безопасность только для авторизации, вызывая статические правила, предоставляемые плагином. т.е.

grails.plugin.springsecurity.controllerAnnotations.staticRules = [ 
    [pattern: '/serviceb/**', access: "hasAnyRole('ROLE_COOL','ROLE_UNCOOL')"], 
    [pattern: '/cools/**', access: ['ROLE_ADMINS']], 
    [pattern: '/*', access: 'isAuthenticated()'] 
] 

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

То, что я пробовал:

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

Далее я попытался использовать решение, предложенное этими двумя сообщений: on stack и это on blog.

Я создал фильтр, чтобы продлить AbstractPreAuthenticatedProcessingFilter

package Cool.service.authentication 
import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter 
import javax.servlet.http.HttpServletRequest 

class CGAuthenticationFilter extends AbstractPreAuthenticatedProcessingFilter { 
    @Override 
    protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) { "username" } 

    @Override 
    protected Object getPreAuthenticatedCredentials(HttpServletRequest request) { "N/A" } 
} 

Мой загрузки конфигурации теперь выглядит следующим образом:

import grails.plugin.springsecurity.SecurityFilterPosition 
import grails.plugin.springsecurity.SpringSecurityUtils 

class BootStrap { 

    def init = { servletContext -> 
     SpringSecurityUtils.clientRegisterFilter('CGAuthenticationFilter', SecurityFilterPosition.PRE_AUTH_FILTER.order) 
    } 
} 

И мои пружинные ресурсы выглядеть следующим образом:

import Cool.service.authentication.CGAuthenticationFilter 

beans = { 
    myAuthenticationFilter(CGAuthenticationFilter) { 
     authenticationManager = ref('authenticationManager') 
     checkForPrincipalChanges = true 
    } 
} 

И наконец, добавили эту строку в мою конфигурацию application.groovy для весеннего секьюрита у плагина:

grails.plugin.springsecurity.providerNames = ['preAuthenticatedAuthenticationProvider', 'anonymousAuthenticationProvider'] 

Однако я получаю супер ошибку geneirc при попытке запустить приложение, где сервер «терпит неудачу», чтобы начать и Java возвращает ненулевое значение обратно. Это заставляет меня поверить, что я возглавляю неправильное направление, и реализация полностью неверна.

+0

Почему вы хотите отключить весеннюю безопасность ?! И что ты пробовал? И, пожалуйста, пройдите через какой-то сценарий использования, который должен быть достигнут. –

+0

@MikelisBaltruks нормально, я добавил больше деталей. Я не хочу отключать весеннюю безопасность, только отключить функцию входа. Заголовок будет содержать необходимую мне информацию. & Сценарий использования сценария начинается во втором абзаце – angryip

ответ

2

Чтобы решить эту проблему, мне пришлось сменить несколько файлов. Во-первых, мой Bootstrap файл теперь содержит следующий блок инициализации:

SpringSecurityUtils.clientRegisterFilter('requestHeaderAuthenticationFilter', SecurityFilterPosition.PRE_AUTH_FILTER) 

Мои бобы файл (resources.groovy) теперь содержит:

userDetailsService(grails.plugin.springsecurity.userdetails.GormUserDetailsService) { 
    grailsApplication = ref('grailsApplication') 
} 

userDetailsByNameServiceWrapper(org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper) { 
    userDetailsService = ref('userDetailsService') 
} 

preAuthenticatedAuthenticationProvider(org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider) { 
    preAuthenticatedUserDetailsService = userDetailsByNameServiceWrapper 
} 

requestHeaderAuthenticationFilter(Cool.service.authentication.GCHeaderAuthenticationFilter) { 
    authenticationManager = ref('authenticationManager') 
} 

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

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