SpringSecurity

2023-12-13 10:49:56

一.,SpringSecurity简介

  1. Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架
    1. 简而言之,他是个框架,而且很牛逼
  2. 作用:保护基于Spring的应用程序的实际标准,致力于为Java应用程序提供身份验证和授权
  3. pring Security的真正强大之处在于可以轻松扩展以满足自定义要求.

二,SpringSecurity功能

  1. 认证: 用户登录, 用来判断当前登录的用户是谁
  2. 授权:判断当前用户有什么权限
  3. 安全防护:防止跨站请求,session攻击等

三,SpringSecurity?应用场景

  1. 用户登录, 传统基于web开发的项目的登录功能.

  2. 用户授权, 在系统中用户拥有哪些操作权限

  3. 单一登录, 一个账号只能在同一时间只能在一个地方进行登录, 如果在其他地方进行第二次登录,则剔除之前登录操作

四,SpringSecurity应用案例

?1.,引入依赖

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>2.6.3</version>
</dependency>

2,编写配置类


package com.itheima.config;

import com.itheima.controller.backend.security.SpringSecurityUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;


/**
 * Security配置类
 */


@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {


/**
     * http请求处理方法
     *
     * @param http
     * @throws Exception
     */


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()// 开启表单认证
                .loginPage("/backend/login.html")// 自定义登录页面
                .loginProcessingUrl("/login")// 登录处理Url
                .usernameParameter("username").passwordParameter("password")// 修改自定义表单name值.
                .defaultSuccessUrl("/backend/pages/main.html")// 登录成功后跳转路径
                .and()
                .authorizeRequests()
                .antMatchers("/backend/login.html").permitAll() //放行登录界面
                .anyRequest().authenticated(); //所有请求都需要登录认证才能访问;
        // 关闭csrf防护
        http.csrf().disable();
        // 允许iframe加载页面
        http.headers().frameOptions().sameOrigin();
    }

    /**
     * 放行静态资源
     * @param web
     * @throws Exception
     */
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/backend/css/**", "/backend/img/**",
                "/backend/js/**", "/backend/plugins/**", "/favicon.ico");
    }

    @Autowired
    private SpringSecurityUserService userService;

    @Bean
    protected PasswordEncoder myPasswordEncoder(){
        return new BCryptPasswordEncoder();
    }

    /**
     * 身份验证管理器
     *
     * @param auth
     * @throws Exception
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService).passwordEncoder(myPasswordEncoder());// 使用自定义用户认证
    }

}

1),service层?基于数据库实现认证功能

实现security的一个UserDetailsService接口, 重写这个接口里面loadUserByUsername

package com.boxuegu.service.impl;

import com.boxuegu.domain.User;
import com.boxuegu.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collection;

/**
 * 基于数据库中完成认证
 */
@Service
public class MyUserDetailsService implements UserDetailsService {

    @Autowired
    UserService userService;

    /**
     * 根据username查询用户实体
     *
     * @param username
     * @return
     * @throws UsernameNotFoundException
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userService.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException(username);// 用户名没有找到
        }
        // 先声明一个权限集合, 因为构造方法里面不能传入null
        Collection<? extends GrantedAuthority> authorities = new ArrayList<>();
        // 需要返回一个SpringSecurity的UserDetails对象
        UserDetails userDetails =
                new org.springframework.security.core.userdetails.User(user.getUsername(),
                        "{noop}" + user.getPassword(),// {noop}表示不加密认证。
                        true, // 用户是否启用 true 代表启用
                        true,// 用户是否过期 true 代表未过期
                        true,// 用户凭据是否过期 true 代表未过期
                        true,// 用户是否锁定 true 代表未锁定
                        authorities);
        return userDetails;
    }
}

文章来源:https://blog.csdn.net/qq_57667629/article/details/134956678
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。