Spring Security后台通过账号密码自动

需要的包:

import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.WebAuthenticationDetails;
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;

代码:

    /**
     * 自动登录
     *
     * @param request
     */
    public void login(HttpServletRequest request){

        UsernamePasswordAuthenticationToken authenticationToken =
                new UsernamePasswordAuthenticationToken("账号", "密码");
        authenticationToken.setDetails(new WebAuthenticationDetails(request));
        Authentication authentication = authenticationManager.authenticate(authenticationToken);

        SecurityContextHolder.getContext().setAuthentication(authentication);
        request.getSession().setAttribute(
                HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY,
                SecurityContextHolder.getContext()
        );
    }
### Spring Security 实现前后端分离的登录认证 为了实现基于Spring Security的前后端分离应用中的用户认证,通常会采用Token机制。在这种模式下,前端发送用户名和密码到后端进行验证;如果凭证有效,则返回一个令牌给客户端用于后续请求的身份验证。 #### 创建安全配置类 首先定义`WebSecurityConfig`来设置哪些URL需要保护以及怎样处理未授权访问的情况: ```java @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() // 关闭CSRF防护以便简化示例 .authorizeRequests() .antMatchers("/login").permitAll() // 登录接口无需身份验证即可访问 .anyRequest().authenticated(); // 所有其他请求都需要经过身份验证 http.addFilterBefore(new JwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); } } ``` 此部分代码关闭了默认启用的跨站点请求伪造(CSRF)[^1],并指定了只有`/login`路径不需要任何权限就能被调用,而其余所有的HTTP请求都必须通过身份验证才能继续执行下去。另外还添加了一个自定义过滤器`JwtAuthenticationFilter`用来解析JWT Tokens。 #### 构建登录控制器 接着创建一个简单的RESTful API作为用户的登录入口点: ```java @RestController @RequestMapping("/api/auth") public class AuthController { private final AuthenticationManager authenticationManager; public AuthController(AuthenticationManagerBuilder builder){ this.authenticationManager = builder.getOrBuild(); } @PostMapping("/signin") public ResponseEntity<?> authenticateUser(@Valid @RequestBody LoginRequest loginRequest, BindingResult bindingResult) { if(bindingResult.hasErrors()){ return new ResponseEntity<>(new ApiResponse(false,bindingResult.getAllErrors().get(0).getDefaultMessage()),HttpStatus.BAD_REQUEST); } try{ Authentication auth = authenticationManager.authenticate( new UsernamePasswordAuthenticationToken(loginRequest.getUsernameOrEmail(), loginRequest.getPassword()) ); SecurityContextHolder.getContext().setAuthentication(auth); String jwt = TokenProvider.generateToken(auth); return ResponseEntity.ok(new JwtAuthenticationResponse(jwt)); } catch (AuthenticationException e) { throw new BadCredentialsException("Invalid username/password supplied"); } } } ``` 上述代码片段展示了如何接收来自前端提交过来的账号信息,并利用内置的`authenticationManager`对象来进行校验工作。一旦成功匹配到了合法账户就会生成一个新的JSON Web Token(JWT),并通过响应体传回给浏览器或其他类型的消费者[^2]。 #### JWT工具类 最后还需要编写辅助函数负责实际生产token字符串的工作: ```java @Component public class TokenProvider implements Serializable { private static final long serialVersionUID = -8795439618872709L; private final Logger logger = LoggerFactory.getLogger(TokenProvider.class); private final String secretKey="secret"; private final Long tokenValidityInMilliseconds=864_000_000L; // 一天有效期 /** * 根据提供的主体和其他参数构建新的JWT实例. */ public String generateToken(Authentication authentication) { CustomUserDetails userDetails=(CustomUserDetails ) authentication.getPrincipal(); Date now=new Date(); Date expiryDate=getExpirationTime(now); return Jwts.builder() .setSubject(Long.toString(userDetails.getId())) .claim("username",userDetails.getUsername()) .signWith(SignatureAlgorithm.HS512,secretKey.getBytes()) .setIssuedAt(now) .setExpiration(expiryDate) .compact(); } ... } ``` 这段逻辑实现了签名密钥设定、过期时间计算等功能,最终产出符合标准格式的安全令牌供下游服务消费[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值