Spring Security登录认证【前后端分离】

这篇博客详细介绍了如何在前后端分离的项目中配置Spring Security进行登录认证。从导入依赖、编写UserDetailsServiceImpl、配置SecurityConfig,到实现JSON格式的登录请求支持,包括登录成功、失败的回调处理,以及访问拦截的设置。通过这种方式,后端能够返回JSON信息给前端,由前端负责页面的跳转。
摘要由CSDN通过智能技术生成

1. 导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <scope>test</scope>
</dependency>

2. 编写用户认证服务类UserDetailsServiceImpl

用户认证服务类需要复写UserDetailsService中的UserDetails -> loadUserByUsername(String username)方法

@Service
public class UserDetailsServiceImpl implements UserDetailsService {
   
    private final MageService service; // 用户信息CRUD服务类

    public UserDetailsServiceImpl(MageService service) {
   
        this.service = service;
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
   
        Mage usr = service.findByName(username); // 根据username查询用户
        if (usr != null) {
   
            return new User(usr.getMageName(), usr.getMagePassword(), AuthorityUtils.NO_AUTHORITIES);
        } else {
   
            throw new UsernameNotFoundException("当前用户不存在!");
        }
    }
}

loadUserByUsername(String username) 方法返回的类型是UserDetails,创建UserDetails类需要传3个参数

分别是username,password,Collection<? extends GrantedAuthority> authorities

authorities是用来设置用户权限访问的,这个参数即使表中没有也不能不传,如果需求不需要设置权限,可以传AuthorityUtils.NO_AUTHORITIES,表示没权限设置

3. 编写Spring Security配置类SecurityConfig

1. Spring Security的配置类需要继承WebSecurityConfigurerAdapter

@Configuration // 声明配置类
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
   
}

2. 设置安全认证的加密方式,早期的Spring Security不是强制性的

/**
* 设置加密方式
*/
@Bean
PasswordEncoder passwordEncoder() {
   
    return new BCryptPasswordEncoder();
}

3. 用户认证方式

/**
* 用户认证
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
   
    auth.userDetailsService(userDetailsService);
}

4. 安全认证的拦截和回调

前后端不分离,安全认证要做的事是拦截请求,根据配置的情况,跳转到指定页面

前后端分离,安全认证要做的事是拦截请求,根据配置的情况,返回json格式的提示信息给前端,让前端做跳转,后端就不再需要写跳转的代码了

1. 登录成功后

前后端不分离,使用.successForwardUrl() 或者.defaultSuccessUrl() 实现登录成功后的页面跳转

前后端分离,使用.successHandler()实现登录成功后向前端发送json格式的回馈信息

.formLogin()
    .loginProcessingUrl("/doLogin")
    .permitAll()
    .successHandler(new AuthenticationSuccessHandler() {
   
        @Override
        public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication authentication) throws IOException,
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值