SpringBoot 集成 Spring Security 自定义认证逻辑备忘

本文详细介绍了如何在SpringBoot应用中集成Spring Security并自定义认证逻辑。从UserDetails、UserDetailsService到AuthenticationProvider的实现,以及登录失败和成功处理逻辑,最后通过SecurityConfig配置和登录页面设置,完成自定义用户认证过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引入 Spring Security 之后(Spring Security 的引入请浏览《SpringBoot 引入 Spring Security 备忘》),Spring Security 将会通过其内置的拦截器对URL进行拦截,以此来管理登录验证和用户权限验证。

当用户登陆时,会被 AuthenticationProcessingFilter 拦截,调用 AuthenticationManager 的实现类来验证用户信息,而 AuthenticationManager 是通过调用 AuthenticationProvider 的实现类来获取用户验证信息, 在 AuthenticationProvider 的实现类中将获取到的用户验证信息与通过 UserDetailsService 的实现类根据用户名称获取到的结果(UserDetails 的实现类)进行匹配验证,如果验证通过后会将用户的权限信息封装一个当前登录用户信息对象 放到 Spring Security 的全局缓存 SecurityContextHolder 中,以备后面访问资源时使用。

因此当我们自定义用户认证逻辑的时候,我们需要编写 AuthenticationProvider、UserDetailsService 和 UserDetails 的实现类,现在开始写代码

 

1、UserDetails 的实现类 SecurityUserInfo

public class SecurityUserInfo implements Serializable, UserDetails {

    private static final long serialVersionUID = 1L;
    /**
     * 用户名
     */
    private String username;
    /**
     * 密码
     */
    private String password;
    /**
     * 盐加密
     */
    private String salt;
    /**
     * 角色码
     */
    private String roleCode;
    /**
     * 帐号状态(0正常 1停用)
     */
    private String status;
    /**
     * 删除状态(0正常 1删除)
     */
    private String delFlag;
    private boolean accountNonExpired;
    private boolean accountNonLocked;
    private boolean credentialsNonExpired;
    private boolean enabled;

    public SecurityUserInfo(String username, String password, String salt, String roleCode, String status, String delFlag, 
            boolean accountNonExpired, boolean accountNonLocked, boolean credentialsNonExpired, boolean enabled) {
        this.username = username;
        this.password = password;
        this.salt = salt;
        this.roleCode = roleCode;
        this.status = status;
        this.delFlag = delFlag;
        this.accountNonExpired = accountNonExpired;
        this.accountNonLocked = accountNonLocked;
        this.credentialsNonExpired = credentialsNonExpired;
        this.enabled = enabled;
    }

    /**
     * 实现用户权限获取方法
     *
     * @return
     */
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        // TODO Auto-generated method stub
        return AuthorityUtils.commaSeparatedStringToAuthorityList(roleCode);
    }

    @Override
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSalt() {
        return salt;
    }

    public void setSalt(S
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值