1. Autenticación de formulario predeterminada
Cree un proyecto de arranque, dependiendo de:
<dependency> <groupId> org.springframework.boot </groupId> <artifactId> spring-boot-starter-web </artifactId> </dependency> <dependency> <groupId> org.springframework.boot </groupId> <artifactId > spring-boot-starter-security </artifactId> </dependency>
Escribe un controlador de prueba
@RestController @RequestMapping ( "/ index" ) clase pública IndexController { @RequestMapping ( "/ test1" ) public String test1 (nombre de cadena, edad entera) { return "test1" ; } }
Inicie el proyecto, visite http: // localhost: 8089 / BootDemo / index / test1, aparece la autenticación de formulario predeterminada
El nombre de usuario predeterminado es usuario, y la contraseña es un código aleatorio generado dinámicamente e impreso en la consola. Por supuesto, el nombre de usuario y la contraseña se pueden configurar en application.properties
spring.security.user.name = prueba
spring.security.user.password = 123
2. Página de inicio de formulario personalizado
Aunque la página de inicio del formulario que viene con Spring Security se puede iniciar rápida y fácilmente, la mayoría de las aplicaciones prefieren proporcionar su propia página de inicio del formulario. En este caso, debe personalizar la página de inicio del formulario.
WebSecurityConfig
paquete com.oy; importar org.springframework.security.config.annotation.web.builders.HttpSecurity; importar org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; importar org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @EnableWebSecurity public class WebSecurityConfig extiende WebSecurityConfigurerAdapter { @Override protegido void configure (HttpSecurity http) lanza Exception { http.authorizeRequests (). AnyRequest (). Authenticated () .and ( ) .formLogin (). LoginPage ( "/mylogin.html" ) .loginProcessingUrl ( "/ login") // Especifique la ruta para procesar la solicitud de inicio de sesión. permitAll () // La página de inicio de sesión y "/ login" no establecen permisos.y () .csrf (). disable ( ); } }
Página de inicio de formulario
<! DOCTYPE html> <html> <head> <meta charset = "UTF-8"> <title> Inserte el título aquí </title> </head> <body> <h2> 自 定义 表单 登陆 页 </h2> <form action = "login" method = "post"> 用户 名 : <input type = "text" name = "username" /> <br/> 密 & nbsp; & nbsp; & nbsp; 码 : <input type = "text" nombre = "contraseña" /> <br/> <input type = "submit" value = "提交" /> </form> </body> </html>
Inicie el proyecto, visite localhost: 8089 / BootDemo / index / test1, y salte automáticamente a la página de inicio de sesión (la dirección del navegador es http: // localhost: 8089 / BootDemo / mylogin.html).
Ingrese test / 123, inicie sesión correctamente, obtenga el resultado de la respuesta:
Si ingresa un nombre de usuario o contraseña incorrectos, el resultado de la respuesta (código de estado 302, redirige a la página de inicio de sesión)
En correspondencia con el proyecto donde el front-end y el back-end están separados, la redirección no necesita ser realizada por el back-end. El back-end generalmente devuelve datos json para informar al front-end si el inicio de sesión es exitoso o no. Esto también se puede lograr en Spring Security.
@EnableWebSecurity public class WebSecurityConfig extiende WebSecurityConfigurerAdapter { @Override protegido void configure (HttpSecurity http) lanza Exception { http.authorizeRequests (). AnyRequest (). Authenticated (). And () .formLogin (). LoginPage ( "/mylogin.html ) .loginProcessingUrl ( "/ login") // Especifique la ruta para procesar la solicitud de inicio de sesión // Especifique la lógica de procesamiento cuando el inicio de sesión sea exitoso.successHandler ( new AuthenticationSuccessHandler () { @Override public voidonAuthenticationSuccess (solicitud HttpServletRequest, respuesta HttpServletResponse, autenticación de autenticación) arroja IOException, ServletException { response.setContentType ( "application / json; charset = utf-8" ); response.getWriter (). write ( "{\" code \ ": 0, \" data \ ": {}}" ); } }) // 指定 登陆 失败 时 的 处理 逻辑 .failureHandler ( new AuthenticationFailureHandler () { @Override public void onAuthenticationFailure (solicitud HttpServletRequest, respuesta HttpServletResponse, excepción AuthenticationException) tirosIOException, ServletException { response.setContentType ( "application / json; charset = utf-8" ); response.setStatus ( 401 ); response.getWriter (). write ( "{\" code \ ": 0, \" msg \ ": \" 用户 名 或 密码 错误 \ "}" ); } }) .permitAll (). y () .csrf (). disable (); } }
Entre ellos, el método successHandler () lleva un parámetro de autenticación, que contiene información como el nombre de usuario actualmente conectado y su función; y el método failureHandler () lleva un parámetro de excepción AuthenticationException.
3. Autenticación y autorización del modelo de base de datos personalizado.
Se sigue el mecanismo de seguridad predeterminado de Spring Security: solo un usuario, solo un rol. En el desarrollo real, esto naturalmente no puede cumplir con los requisitos.
Escriba tres controladores para la prueba. Entre ellos, el contenido bajo / admin / api está relacionado con la administración de fondo del sistema. Debe tener derechos de administrador (con el rol de "admin") para acceder; / user / api debe estar conectado y tener "user" "Rol de acceso.
@RestController @RequestMapping ( "/ admin / api" ) clase pública AdminController { @GetMapping ( "/ hello" ) public String hello () { return "hello, admin" ; } } @RestController @RequestMapping ( "/ user / api" ) public class UserController { @GetMapping ( "/ hello" ) public String hello () { return "hello, user" ; ) public class AppController { @GetMapping ( "/ hello" ) public String hello () { return "hello, app" ; } }
Inicie el proyecto, visite http: // localhost: 8089 / BootDemo / user / api / hello, vaya a la página de inicio de sesión e inicie sesión con test / 123. Visite http: // localhost: 8089 / BootDemo / user / api / hello nuevamente, y el servidor devuelve 403 en este momento, lo que indica que la autorización del usuario ha fallado (401 representa la falla de autenticación del usuario).
Modelo de base de datos personalizada
---