1、自定义用户名和密码
在Spring security中用户名默认为username
字段,密码默认为password
字段,这些是在过滤器UsernamePasswordAuthenticationFilter中定义好的。如果我们需要自定义这两个字段,则需要在SecurityConfig类中configure()方法中,使用usernameParameter()和passwordParameter()做同步修改。比如usernameParameter(usernameTest)
和passwordParameter(passwordTest)
,表示用户名字段为usernameTest
,密码字段为passwordTest
// 表单认证
http.formLogin() .loginProcessingUrl("/login") //当发现/login 时认为是登录,需 要执行 UserDetailsServiceImpl
.successForwardUrl("/welcome") //登录成功后,跳转到指定请求(此处是 post 请求)
.failureForwardUrl("/loginFail")//登录失败
.loginPage("/login.html")
.usernameParameter("username1").
passwordParameter("password1");
2、自定义登录成功跳转地址
Spring security默认使用.successForwardUrl()
进行登录成功转发,但是不能跨站,如果我们需要自定义跨站的跳转地址,需要先实现AuthenticationSuccessHandler
接口
package com.example.springsecurity.config;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 自定义登录成功跳转地址
*/
public class AuthenticationSuccessHandlerExtend implements AuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
//跳转至csdn首页
httpServletResponse.sendRedirect("https://www.csdn.net/");
}
}
然后使用.successHandler()
替换.successForwardUrl()
// .successForwardUrl("/welcome") //登录成功后,跳转到指定请求(此处是 post 请求)
.successHandler(new AuthenticationSuccessHandlerExtend())
3、自定义登录失败跳转地址
与第2点类似,Spring security默认使用.failureForwardUrl()
进行登录成功转发,自定义需要先实现AuthenticationFailureHandler
接口
package com.example.springsecurity.config;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 自定义登录失败跳转地址
*/
public class AuthenticationFailureHandlerExtend implements AuthenticationFailureHandler {
@Override
public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
//跳转至csdn首页
httpServletResponse.sendRedirect("https://www.csdn.net/");
}
}
然后使用.failureHandler()
替换.failureForwardUrl()
// .failureForwardUrl("/loginFail")//登录失败
.failureHandler(new AuthenticationFailureHandlerExtend())
4、常见授权匹配方式
1、anyRequest()
:表示匹配所有的请求。一般情况使用anyRequest().authenticated();
来对所有请求进行认 证。
2、antMatcher()
:参数是不定向参数,每个参数是一个 ant 表达式,用于匹配 URL规则。规则如下: ? 匹配一个字符 ;* 匹配 0 个或多个字符 ;** 匹配 0 个或多个目录;比如:.antMatchers("/css/**,/js/**").permitAll()
3、mvcMatchers()
:适用于配置了 servletPath 的情况,servletPath 就是所有的 URL 的统一前缀。
5、常见内置访问控制方法
1、permitAll()
:表示所匹配的 URL 任何人都允许访问
2、authenticated()
:表示所匹配的 URL 都需要被认证才能访问
3、anonymous()
:表示可以匿名(未认证)访问匹配的 URL
4、denyAll()
:表示所匹配的 URL 都不允许被访问
5、rememberMe()
:被“记住”的用户允许访问
6、fullyAuthenticated()
:如果用户不是被 remember me 的,才可以访问
6、常见角色权限判断方法
1、hasAuthority(String)
:判断用户是否具有特定的权限,严格区分大小写。如.antMatchers("/test.html").hasAuthority("admin")
表示必须具有admin权限才能访问test.html页面
2、hasAnyAuthority(String ...)
:如果用户具备给定权限中某一个,就允许访问。如.antMatchers("/test.html").hasAnyAuthority("admin","admiN")
表示具有admin和admiN其中至少一个权限才能访问test.html页面
3、hasRole(String)
:如果用户具备给定角色就允许访问,否则出现 403。(备注:用户角色以ROLE_ 开头,后面为角色名称。如ROLE_admin 中的 admin 是角色名,ROLE_是字符前缀。 使用 hasRole()方法时参数也只写 admin 即可)
4、hasAnyRole(String ...)
:如果用户具备给定角色的任意一个,就允许被访问
5、hasIpAddress(String)
:如果请求是指定的 IP 就运行访问,通过 request.getRemoteAddr()获取 ip
7、自定义无权限403返回信息
自定义AccessDeniedHandlerExtend实现AccessDeniedHandler接口,以流的方式输出403对应信息
package com.example.springsecurity.config;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 自定义无权限403返回信息
*/
@Component
public class AccessDeniedHandlerExtend implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AccessDeniedException e) throws IOException, ServletException {
httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
httpServletResponse.setHeader("Content-Type","application/json;charset=utf-8") ;
PrintWriter out = httpServletResponse.getWriter();
out.write("{\"status\":\"403\",\"msg\":\"权限不足\"}");
out.flush();
out.close();
}
}
在SecurityConfig配置类的configure()方法中加入如下代码
//异常处理
http.exceptionHandling().accessDeniedHandler(accessDeniedHandlerExtend);