国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot3安全管理

這篇具有很好參考價值的文章主要介紹了SpringBoot3安全管理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄
  • 一、簡介
  • 二、工程搭建
    • 1、工程結構
    • 2、依賴管理
  • 三、配置管理
    • 1、核心配置類
    • 2、認證數(shù)據源
    • 3、認證流程
    • 4、身份過濾器
  • 四、核心功能
    • 1、登錄退出
    • 2、權限校驗
  • 五、參考源碼

標簽:Security.登錄.權限;

一、簡介

SpringSecurity組件可以為服務提供安全管理的能力,比如身份驗證、授權和針對常見攻擊的保護,是保護基于spring應用程序的事實上的標準;

在實際開發(fā)中,最常用的是登錄驗證和權限體系兩大功能,在登錄時完成身份的驗證,加載相關信息和角色權限,在訪問其他系統(tǒng)資源時,進行權限的驗證,保護系統(tǒng)的安全;

二、工程搭建

1、工程結構

SpringBoot3安全管理

2、依賴管理

starter-security依賴中,實際上是依賴spring-security組件的6.1.1版本,對于該框架的使用,主要是通過自定義配置類進行控制;

<!-- 安全組件 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>${spring-boot.version}</version>
</dependency>

三、配置管理

1、核心配置類

在該類中涉及到的配置非常多,主要是服務的攔截控制,身份認證的處理流程以及過濾器等,很多自定義的處理類通過該配置進行加載;

@EnableWebSecurity
@EnableMethodSecurity
@Configuration
public class SecurityConfig {

    /**
     * 基礎配置
     */
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
        // 配置攔截規(guī)則
        httpSecurity.authorizeHttpRequests(authorizeHttpRequests->{
            authorizeHttpRequests
                    .requestMatchers(WhiteConfig.whiteList()).permitAll()
                    .anyRequest().authenticated();
        });
        // 禁用默認的登錄和退出
        httpSecurity.formLogin(AbstractHttpConfigurer::disable);
        httpSecurity.logout(AbstractHttpConfigurer::disable);
        httpSecurity.csrf(AbstractHttpConfigurer::disable);

        // 異常時認證處理流程
        httpSecurity.exceptionHandling(exeConfig -> {
            exeConfig.authenticationEntryPoint(authenticationEntryPoint());
        });

        // 添加過濾器
        httpSecurity.addFilterAt(authTokenFilter(),CsrfFilter.class);
        return httpSecurity.build() ;
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Bean
    public AuthenticationEntryPoint authenticationEntryPoint() {
        return new AuthExeHandler();
    }

    @Bean
    public OncePerRequestFilter authTokenFilter () {
        return new AuthTokenFilter();
    }

    /**
     * 認證管理
     */
    @Bean
    public AuthenticationManager authenticationManager() {
        return new ProviderManager(authenticationProvider()) ;
    }

    /**
     * 自定義用戶認證流
     */
    @Bean
    public AbstractUserDetailsAuthenticationProvider authenticationProvider() {
        return new AuthProvider() ;
    }
}

2、認證數(shù)據源

UserDetailsService是加載用戶特定數(shù)據的核心接口,編寫用戶服務類并實現(xiàn)該接口,提供用戶信息和權限體系的數(shù)據查詢和加載,作為用戶身份識別的關鍵憑據;

@Service
public class UserService implements UserDetailsService {

    @Resource
    private UserBaseMapper userBaseMapper;
    @Resource
    private BCryptPasswordEncoder passwordEncoder;

    @Override
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
        UserBase queryUser = geyByUserName(userName);
        if (Objects.isNull(queryUser)){
            throw new AuthException("該用戶不存在");
        }
        List<GrantedAuthority> grantedAuthorityList = new ArrayList<>() ;
        grantedAuthorityList.add(new SimpleGrantedAuthority(queryUser.getUserRole())) ;
        return new User(queryUser.getUserName(),queryUser.getPassWord(),grantedAuthorityList);
    }

    public int register (UserBase userBase){
        if (!Objects.isNull(userBase)){
            userBase.setPassWord(passwordEncoder.encode(userBase.getPassWord()));
            userBase.setCreateTime(new Date()) ;
            return userBaseMapper.insert(userBase) ;
        }
        return 0 ;
    }

    public UserBase getById (Integer id){
        return userBaseMapper.selectById(id) ;
    }

    public UserBase geyByUserName (String userName){
        List<UserBase> userBaseList = new LambdaQueryChainWrapper<>(userBaseMapper)
                .eq(UserBase::getUserName,userName).last("limit 1").list();
        if (userBaseList.size() > 0){
            return userBaseList.get(0) ;
        }
        return null ;
    }
}

3、認證流程

自定義用戶名和密碼的身份令牌認證邏輯,基于用戶名Username從上面的用戶服務類中加載數(shù)據并校驗,在驗證成功后將用戶的身份令牌返回給調用者;

@Component
public class AuthProvider extends AbstractUserDetailsAuthenticationProvider {
    private static final Logger log = LoggerFactory.getLogger(AuthProvider.class);
    
    @Resource
    private UserService userService;
    @Resource
    private BCryptPasswordEncoder passwordEncoder;

    @Override
    protected void additionalAuthenticationChecks(
            UserDetails userDetails, UsernamePasswordAuthenticationToken authentication)
            throws AuthenticationException {
        User user = (User) userDetails;
        String loginPassword = authentication.getCredentials().toString();
        log.info("user:{},loginPassword:{}",user.getPassword(),loginPassword);
        if (!passwordEncoder.matches(loginPassword, user.getPassword())) {
            throw new AuthException("賬號或密碼錯誤");
        }
        authentication.setDetails(user);
    }
    @Override
    protected UserDetails retrieveUser(
            String username, UsernamePasswordAuthenticationToken authentication)
            throws AuthenticationException {
        log.info("username:{}",username);
        return userService.loadUserByUsername(username);
    }
}

4、身份過濾器

通過繼承OncePerRequestFilter抽象類,實現(xiàn)用戶身份的過濾器,如果不是白名單請求,需要驗證令牌是否正確有效,SecurityContextHolder默認狀態(tài)下使用ThreadLocal存儲信息;

@Component
public class AuthTokenFilter extends OncePerRequestFilter {
    @Resource
    private AuthTokenService authTokenService ;
    @Resource
    private AuthExeHandler authExeHandler ;

    @Override
    protected void doFilterInternal(@Nonnull HttpServletRequest request,
                                    @Nonnull HttpServletResponse response,
                                    @Nonnull FilterChain filterChain) throws ServletException, IOException {
        String uri = request.getRequestURI();
        if (Arrays.asList(WhiteConfig.whiteList()).contains(uri)){
            // 如果是白名單直接放行
            filterChain.doFilter(request,response);
        } else {
            String token = request.getHeader("Auth-Token");
            if (Objects.isNull(token) || token.isEmpty()){
                // Token不存在,攔截返回
                authExeHandler.commence(request,response,null);
            } else {
                Object object = authTokenService.getToken(token);
                if (!Objects.isNull(object) && object instanceof User user){
                    UsernamePasswordAuthenticationToken authentication =
                            new UsernamePasswordAuthenticationToken(user, null,user.getAuthorities());
                    SecurityContextHolder.getContext().setAuthentication(authentication);
                    filterChain.doFilter(request,response);
                } else {
                    // Token驗證失敗,攔截返回
                    authExeHandler.commence(request,response,null);
                }
            }
        }
    }
}

四、核心功能

1、登錄退出

自定義登錄退出兩個接口,基于用戶名和密碼執(zhí)行上述的身份認證流程,如果認證成功則返回用戶的身份令牌,在請求「非」白名單接口時需要在請求頭中Auth-Token:token攜帶該令牌,在退出時會清除身份信息;

@Service
public class LoginService {

    private static final Logger log = LoggerFactory.getLogger(LoginService.class);

    @Resource
    private AuthTokenService authTokenService ;
    @Resource
    private AuthenticationManager authenticationManager;

    public String doLogin (UserBase userBase){
        AbstractAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(
                userBase.getUserName().trim(), userBase.getPassWord().trim());
        Authentication authentication = authenticationManager.authenticate(authToken) ;
        User user = (User) authentication.getDetails();
        return authTokenService.createToken(user) ;
    }

    public Boolean doLogout (String authToken){
        SecurityContextHolder.clearContext();
        return authTokenService.deleteToken(authToken) ;
    }
}

@Service
public class AuthTokenService {

    private static final Logger log = LoggerFactory.getLogger(AuthTokenService.class);
    @Resource
    private RedisTemplate<String,Object> redisTemplate ;

    public String createToken (User user){
        String userName = user.getUsername();
        String token = DigestUtils.md5DigestAsHex(userName.getBytes());
        log.info("user-name:{},create-token:{}",userName,token);
        redisTemplate.opsForValue().set(token,user,10, TimeUnit.MINUTES);
        return token ;
    }

    public Object getToken (String token){
        return redisTemplate.opsForValue().get(token);
    }

    public Boolean deleteToken (String token){
        return redisTemplate.delete(token);
    }
}

2、權限校驗

UserWeb類中提供用戶的注冊接口,在用戶表中創(chuàng)建兩個測試用戶:admin對應ROLE_Admin角色,user對應ROLE_User角色,驗證如下幾個接口的權限控制;

select接口不需要鑒權,攔截器放行即可訪問;getUser接口校驗ROLE_User角色;getAdmin接口校驗ROLE_Admin角色;query接口校驗兩個角色中的任意一個即可;

兩個不同用戶登錄獲取到各自的身份令牌,使用不同的令牌請求接口,在PreAuthorize驗證通過后才可以正常訪問;文章來源地址http://www.zghlxwxcb.cn/news/detail-646433.html

@RestController
public class UserWeb {

    @Resource
    private UserService userService ;

    @PostMapping("/register")
    public String register (@RequestBody UserBase userBase){
        return "register-"+userService.register(userBase) ;
    }

    @GetMapping("/select/{id}")
    public UserBase select (@PathVariable Integer id){
        return userService.getById(id) ;
    }

    @PreAuthorize("hasRole('User')")
    @GetMapping("/user/{id}")
    public UserBase getUser (@PathVariable Integer id){
        return userService.getById(id) ;
    }

    @PreAuthorize("hasRole('Admin')")
    @GetMapping("/admin/{id}")
    public UserBase getAdmin (@PathVariable Integer id){
        return userService.getById(id) ;
    }

    @PreAuthorize("hasAnyRole('User','Admin')")
    @GetMapping("/query/{id}")
    public UserBase query (@PathVariable Integer id){
        return userService.getById(id) ;
    }
}

五、參考源碼

文檔倉庫:
https://gitee.com/cicadasmile/butte-java-note

源碼倉庫:
https://gitee.com/cicadasmile/butte-spring-parent

到了這里,關于SpringBoot3安全管理的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 安全運營之資產安全信息管理

    安全運營之資產安全信息管理

    安全風險管理的三要素分別是資產、威脅和脆弱性,脆弱性的存在將會導致風險,而威脅主體利用脆弱性產生風險。網絡攻擊主要利用了系統(tǒng)的脆弱性。由于網絡管理對象(資產)自身的脆弱性,使得威脅的發(fā)生成為可能,從而造成了不同的影響,形成了風險。“摸清家底,

    2024年02月15日
    瀏覽(20)
  • 信息安全管理(CISP)—— 信息安全保障

    信息安全管理(CISP)—— 信息安全保障

    寫在最前面 一、信息安全保障知識框架 二、信息安全保障基礎 1.信息安全的定義 2.信息安全問題 3.信息安全問題的根源與特征 4.信息安全屬性 5.信息安全視角 6.信息安全發(fā)展階段 7.威脅情報與態(tài)勢感知 三、信息安全保障框架 1.PDR模型 2.PPDR模型 3.IATF模型 4.信息系統(tǒng)安全保障

    2024年02月08日
    瀏覽(29)
  • 網絡安全——基線管理與安全配置

    網絡安全——基線管理與安全配置

    一、基線管理概述 1、什么是安全基線 簡單來說,就是安全的最低標準線,滿足安全需求的最低要求 ?2、基線的相關名詞 ?3、基線核查的對象 必須把所有資產統(tǒng)計出來,如果漏了的話,可能會成為一個薄弱點,被攻擊 4、基線管理 基線配置不僅僅是一項工作任務,更是一項

    2024年02月11日
    瀏覽(17)
  • SpringBoot3文件管理

    SpringBoot3文件管理

    目錄 一、簡介 二、工程搭建 1、工程結構 2、依賴管理 三、上傳下載 1、配置管理 2、上傳下載 四、Excel文件 1、Excel創(chuàng)建 2、Excel讀取 3、解析監(jiān)聽 4、導入導出 五、參考源碼 標簽:上傳.下載.Excel.導入.導出; 在項目中,文件管理是常見的復雜功能; 首先文件的類型比較多樣

    2024年02月13日
    瀏覽(20)
  • 二、安全與風險管理—風險管理

    目錄 一、什么是風險及風險管理過程 二、威脅建模 三、主動攻擊和被動攻擊

    2024年02月03日
    瀏覽(26)
  • 安全狗云原生安全-云甲·云原生容器安全管理系統(tǒng)

    安全狗云原生安全-云甲·云原生容器安全管理系統(tǒng)

    隨著云計算的快速發(fā)展,容器技術逐漸成為主流。然而,隨著容器的普及,安全問題也日益突出。為了解決這一問題,安全狗推出了云原生容器安全管理系統(tǒng)——云甲。 云甲是安全狗云原生安全的重要組成部分,它采用了先進的云原生技術,為容器提供了全面的安全保障。

    2024年02月04日
    瀏覽(18)
  • K8S應用流程安全(鏡像安全 配置管理 訪問安全)

    K8S應用流程安全(鏡像安全 配置管理 訪問安全)

    1.1.1 構建原則 學習目標 這一節(jié),我們從 基礎知識、原則解讀、小結 三個方面來學習。 基礎知識 k8s平臺使用業(yè)務環(huán)境 需求 鏡像的使用流程 Docker鏡像加載 UnionFS 原則解讀 構建樣式 構建原則 實踐原則 分層效果 功能效果 小結 1.1.2 Dockerfile實踐 學習目標 這一節(jié),我們從 基礎

    2024年02月13日
    瀏覽(24)
  • 一文解讀ISO26262安全標準:功能安全管理

    下文的表中,一些方法的推薦等級說明: “++”表示對于指定的ASIL等級,高度推薦該方法; “+” 表示對于指定的ASIL等級,推薦該方法; “o” 表示對于指定的ASIL等級,不推薦該方法。 功能安全管理分為幾個階段:概念階段、產品開發(fā)階段、生產發(fā)布之后的階段。 在概念

    2024年04月16日
    瀏覽(31)
  • 智慧消防管理云平臺 電氣火災安全用電管理

    智慧消防管理云平臺 電氣火災安全用電管理

    ? 1、概述 ??安科瑞智慧消防綜合管理云平臺基于物聯(lián)網、大數(shù)據、云計算等現(xiàn)代信息技術,將分散的火災自動報警設備、電氣火災監(jiān)控設備、智慧煙感探測器、智慧消防用水等設備連接形成網絡,并對這些設備的狀態(tài)進行智能化感知、識別、定位,實時動態(tài)采集消防信息

    2024年04月28日
    瀏覽(26)
  • 內網安全管理系統(tǒng)(保密管理系統(tǒng))

    內網安全管理系統(tǒng)(保密管理系統(tǒng))

    在當今信息化的時代,企業(yè)的內網已經成為其核心資產的重要組成部分。 隨著企業(yè)的快速發(fā)展和信息化程度的提升,內網安全問題日益凸顯,如何保障內網的安全和機密信息的保密性,已經成為企業(yè)亟待解決的問題。 內網安全管理系統(tǒng)(保密管理系統(tǒng))是一種集成了先進的

    2024年01月20日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包