Spring security常见用法(一)

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);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值