requestparam requestmapping recibir puede pathvariable paso parametros para método mvc modelandview formulario escritura encontrar ejemplo commandname atributo spring spring-security

requestmapping - recibir parametros spring



Cómo pasar un parámetro adicional con la página de inicio de sesión de seguridad de primavera (8)

@ user1322340 no proporciona detalles del implemento para obtener Atributos de sesión en la función loadUserByUsername:

Paso 1: sigue todos los pasos provistos por @ user1322340

Paso 2: necesitas agregar una configuración en web.xml como esta:

<listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener>

Paso 3: Usa dicho código para obtener atributos:

RequestContextHolder.getRequestAttributes().getAttribute("yourAttributeName", RequestAttributes.SCOPE_SESSION);

Paso 4: Registre su filtro en la configuración de seguridad de primavera. Si obtiene un error, debe especificar " authenticationManager ". después de registrar su filtro en config. Debe configurar authentManagerBean para su filtro extendido y configurarlo de esa manera:

@EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public ExUsernamePasswordAuthenticationFilter exUsernamePasswordAuthenticationFilter() throws Exception { ExUsernamePasswordAuthenticationFilter exUsernamePasswordAuthenticationFilter = new ExUsernamePasswordAuthenticationFilter(); exUsernamePasswordAuthenticationFilter .setAuthenticationManager(authenticationManagerBean()); return exUsernamePasswordAuthenticationFilter; } @Bean @Override public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } @Override protected void configure(HttpSecurity http) throws Exception { RequestMatcher requestMatcher = new RequestMatcher() { @Override public boolean matches(HttpServletRequest httpServletRequest) { if (httpServletRequest.getRequestURI().indexOf("/api", 0) >= 0) { return true; } return false; } }; http .addFilterBefore(exUsernamePasswordAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) ... } }

Estoy tratando de establecer el nombre de la base de datos como el parámetro de entrada de solicitud desde la página de inicio de sesión de seguridad de primavera. En este momento, solo obtengo un nombre de usuario que se recuperó utilizando la seguridad Spring Spring SecurityContextHolder.getContext().getAuthentication() .

¿Cómo acceder al campo adicional que se ha configurado en la página de inicio de sesión?


Elaborando el comentario de @ Vacuum

Aquí hay una manera simple (no probada, pero creo que esto funcionaría)

1) Cree una nueva clase ExUsernamePasswordAuthenticationFilter que ampliará el filtro predeterminado y tomará el parámetro adicional y lo almacenará en la sesión. Se verá algo como esto:

public class ExUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter { @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { final String dbValue = request.getParameter("dbParam"); request.getSession().setAttribute("dbValue", dbValue); return super.attemptAuthentication(request, response); } }

2) En su implementación de UserDetailsService, modifique su implementación de:

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException;

para tomar la variable de sesión que el filtro del paso 1) pone a disposición.

3) en su configuración de seguridad <http /> , anule el filtro predeterminado con su configuración personalizada

<custom-filter ref="beanForYourCustomFilterFromStep1" position="FORM_LOGIN_FILTER"/>

Consulte esta parte de la documentación para obtener más información sobre los filtros personalizados: http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ns-custom-filters


Hay una manera más fácil si está utilizando AuthenticationProvider personalizado. Puede simplemente HttpServletRequest y recuperar su parámetro adicional:

@Component public class CustomAuthenticationProvider implements AuthenticationProvider { @Autowired(required = false) private HttpServletRequest request; @Autowired private MyAccountService myAccountService; @Override public Authentication authenticate(Authentication authentication) { System.out.println("request testing= " + request.getParameter("testing")); ..... } @Override public boolean supports(Class<?> authentication) { return authentication.equals(UsernamePasswordAuthenticationToken.class); } }


Hay varias maneras de hacerlo, pero la forma oficial de hacerlo es usar un AuthenticationDetails y AuthenticationDetailsSource , subclasificando Spring WebAuthenticationDetails y WebAuthenticationDetailsSource , respectivamente. Agregue el campo adicional a los detalles personalizados de WebAuthenticationDetails y WebAuthenticationDetails que la WebAuthenticationDetailsSource personalizada obtenga los datos de la solicitud para poblar el campo.

En Spring Security 3.1 es fácil de configurar utilizando el atributo authentication-details-source-ref del elemento <form-login> .

En 3.0, debes usar un BeanPostProcessor . Hay un ejemplo en las preguntas frecuentes de Spring Security sobre el uso de BeanPostProcessor para configurar un WebAuthenticationDetailsSource personalizado .

Una vez hecho esto, puede llamar a SecurityContextHolder.getContext (). GetAuthentication (). GetDetails () para obtener acceso a su campo adicional.


La manera más simple en solo 2 pasos:

Paso 1.

Agregue el siguiente oyente en web.xml:

<listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value></param-value> </context-param>

Paso 2.

Agregue lo siguiente en su método de clase donde desea obtener un parámetro adicional:

RequestAttributes attribs = RequestContextHolder.getRequestAttributes(); if (RequestContextHolder.getRequestAttributes() != null) { HttpServletRequest request = ((ServletRequestAttributes) attribs).getRequest(); }

Ahora puede obtener su parámetro adicional de la siguiente manera, suponiendo que el parámetro adicional se llame "loginType":

request.getParameter("loginType")


Manera simple:

1) registrar RequestContextListener

@Bean public RequestContextListener requestContextListener(){ return new RequestContextListener(); }

2) Y a la clase principal:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder. currentRequestAttributes()). getRequest();

3) Después de eso podemos tomar params en encabezados personalizados:

request.getHeader("OrganizationId")


Para la seguridad de primavera 3.0 o superior que utiliza la configuración de Java, los siguientes pasos simples funcionan bien.

  • Agregue un filtro de antes del UserNameandPasswordAuthenticationFilter en el objeto HttpSecurity en configure.

    http.addFilterBefore(new YourFilter(), UsernamePasswordAuthenticationFilter.class);

  • Deje que el filtro tenga una línea como esta para obtener los campos necesarios en su solicitud para la sesión.

    if(requestPath != null &&requestPath.equals("/login") ) { session.setAttribute("yourParam",req.getParameter("yourParam")); }

  • Más tarde, puede obtener el valor del parámetro de la sesión en cualquier clase como:

    String yourParam =(String)request.getSession().getAttribute("yourParam");


sourcedelica mencionó usar AuthenticationDetailsSource y un Custom AuthenticationDetails . Aquí hay un ejemplo.

Añada el atributo authentication-details-source-ref con el ID de bean customWebAuthenticationDetailsSource para form-login :

<security:http> <security:intercept-url pattern="/**" access="..." /> <security:form-login authentication-details-source-ref="customWebAuthenticationDetailsSource" login-page="..." /> <security:logout logout-success-url="..." /> </security:http>

Crea una nueva clase CustomWebAuthenticationDetailsSource :

package security; import org.springframework.security.authentication.AuthenticationDetailsSource; import org.springframework.security.web.authentication.WebAuthenticationDetails; import javax.servlet.http.HttpServletRequest; public class CustomWebAuthenticationDetailsSource implements AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails> { @Override public WebAuthenticationDetails buildDetails(HttpServletRequest context) { return new CustomWebAuthenticationDetails(context); } }

y los CustomWebAuthenticationDetails relacionados:

package security; import org.springframework.security.web.authentication.WebAuthenticationDetails; import javax.servlet.http.HttpServletRequest; public class CustomWebAuthenticationDetails extends WebAuthenticationDetails { private final String yourParameter; public CustomWebAuthenticationDetails(HttpServletRequest request) { super(request); yourParameter = request.getParameter("yourParameter"); } public String getyourParameter() { return yourParameter; } //TODO override hashCode, equals and toString to include yourParameter @Override public int hashCode() { /* collapsed */ } @Override public boolean equals(Object obj) { /* collapsed */ } @Override public String toString() { /* collapsed */ } }