欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springSecurity用戶認(rèn)證和授權(quán)的實(shí)現(xiàn)

 更新時(shí)間:2024年07月02日 10:20:59   作者:畢竟尹穩(wěn)健  
Spring?Security?是一個(gè)開(kāi)源的安全框架,提供了基于權(quán)限的訪問(wèn)控制、身份認(rèn)證的功能,本文主要介紹了springSecurity用戶認(rèn)證和授權(quán),具有一定參考價(jià)值,感興趣的可以了解一下

一,框架介紹


Spring 是一個(gè)非常流行和成功的 Java 應(yīng)用開(kāi)發(fā)框架。Spring Security 基于 Spring 框架,提供了一套 Web 應(yīng)用安全性的完整解決方案。一般來(lái)說(shuō),Web 應(yīng)用的安全性包括用戶認(rèn)證(Authentication)和用戶授權(quán)(Authorization)兩個(gè)部分。

(1)用戶認(rèn)證指的是:驗(yàn)證某個(gè)用戶是否為系統(tǒng)中的合法主體,也就是說(shuō)用戶能否訪問(wèn)該系統(tǒng)。用戶認(rèn)證一般要求用戶提供用戶名和密碼。系統(tǒng)通過(guò)校驗(yàn)用戶名和密碼來(lái)完成認(rèn)證過(guò)程。

(2)用戶授權(quán)指的是驗(yàn)證某個(gè)用戶是否有權(quán)限執(zhí)行某個(gè)操作。在一個(gè)系統(tǒng)中,不同用戶所具有的權(quán)限是不同的。比如對(duì)一個(gè)文件來(lái)說(shuō),有的用戶只能進(jìn)行讀取,而有的用戶可以進(jìn)行修改。一般來(lái)說(shuō),系統(tǒng)會(huì)為不同的用戶分配不同的角色,而每個(gè)角色則對(duì)應(yīng)一系列的權(quán)限。

Spring Security其實(shí)就是用filter,多請(qǐng)求的路徑進(jìn)行過(guò)濾。

(1)如果是基于Session,那么Spring-security會(huì)對(duì)cookie里的sessionid進(jìn)行解析,找到服務(wù)器存儲(chǔ)的sesion信息,然后判斷當(dāng)前用戶是否符合請(qǐng)求的要求。

(2)如果是token,則是解析出token,然后將當(dāng)前請(qǐng)求加入到Spring-security管理的權(quán)限信息中去

認(rèn)證與授權(quán)實(shí)現(xiàn)思路

二 ,如何實(shí)現(xiàn)

1 ,導(dǎo)入依賴

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

2,代碼 

package com.demo.config;

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.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

@EnableWebSecurity
public class Security extends WebSecurityConfiguration {
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/public/**").permitAll() // 允許訪問(wèn)公開(kāi)路徑
                .antMatchers("/public/index").hasRole("vip") // 需要指定用戶在可以使用
                .antMatchers("/admin/**").hasRole("admin") // 需要指定用戶在可以使用
                .anyRequest().authenticated() // 其他請(qǐng)求需要認(rèn)證
                .and()
                .formLogin() // 使用表單登錄
                .loginPage("/login") // 指定登錄頁(yè)面
                .permitAll() // 允許所有用戶訪問(wèn)登錄頁(yè)面
                .and()
                .logout() // 配置注銷
                .logoutUrl("/logout") // 注銷路徑
                .logoutSuccessUrl("/login?logout") // 注銷成功后跳轉(zhuǎn)的頁(yè)面
                .permitAll();

    }
    //緩存中
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                //添加  名字為 admin  密碼 為 admin123 的用戶 基于權(quán)限 ADMIN
                .withUser("admin").password("admin123").roles("ADMIN")
                .and()
                .withUser("user").password("user123").roles("USER");
    }
    //從數(shù)據(jù)庫(kù)中
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 從數(shù)據(jù)庫(kù)或其他數(shù)據(jù)源加載用戶信息
        // 這里簡(jiǎn)單起見(jiàn),直接使用內(nèi)存中的用戶信息
        if ("admin".equals(username)) {
            return org.springframework.security.core.userdetails.User.builder()
                    .username("admin")
                    .password("{noop}admin") // {noop}表示不加密,實(shí)際項(xiàng)目中應(yīng)該使用加密的密碼
                    .roles("ADMIN")
                    .build();
        } else if ("user".equals(username)) {
            return org.springframework.security.core.userdetails.User.builder()
                    .username("user")
                    .password("{noop}user")
                    .roles("USER")
                    .build();
        } else {
            throw new UsernameNotFoundException("User not found");
        }
    }
}
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MyController {

    @GetMapping("/user")
    @Secured("ROLE_USER") // 要求用戶具有ROLE_USER角色才能訪問(wèn)
    public String userPage() {
        return "user";
    }
}
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MyController {

    @GetMapping("/admin")
    @PreAuthorize("hasRole('ADMIN')") // 要求用戶具有ROLE_ADMIN角色才能訪問(wèn)
    public String adminPage() {
        return "admin";
    }

    @GetMapping("/user")
    @PreAuthorize("hasRole('USER')") // 要求用戶具有ROLE_USER角色才能訪問(wèn)
    public String userPage() {
        return "user";
    }
}

到此這篇關(guān)于springSecurity用戶認(rèn)證和授權(quán)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)springSecurity 認(rèn)證和授權(quán)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • struts2 validation.xml 驗(yàn)證規(guī)則代碼解析

    struts2 validation.xml 驗(yàn)證規(guī)則代碼解析

    這篇文章主要介紹了struts2 validation.xml 驗(yàn)證規(guī)則代碼解析,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • MyBatis屬性名和字段名配置不一致的解決

    MyBatis屬性名和字段名配置不一致的解決

    在使用MyBatis進(jìn)行持久化框架開(kāi)發(fā)時(shí),經(jīng)常會(huì)遇到屬性名和數(shù)據(jù)庫(kù)字段名不一致的情況,本文主要介紹了MyBatis屬性名和字段名配置不一致的解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):線性表

    java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):線性表

    這篇文章主要介紹了Java的數(shù)據(jù)解構(gòu)基礎(chǔ),希望對(duì)廣大的程序愛(ài)好者有所幫助,同時(shí)祝大家有一個(gè)好成績(jī),需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-07-07
  • Spring MVC整合FreeMarker的示例

    Spring MVC整合FreeMarker的示例

    這篇文章主要介紹了Spring MVC整合FreeMarker的示例,幫助大家更好的理解和使用Spring MVC,感興趣的朋友可以了解下
    2020-12-12
  • 淺談Java中hashCode的正確求值方法

    淺談Java中hashCode的正確求值方法

    這篇文章主要介紹了淺談Java中hashCode的正確求值方法,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Java實(shí)現(xiàn)讀寫文件功能的代碼分享

    Java實(shí)現(xiàn)讀寫文件功能的代碼分享

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)讀寫文件功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • 如何解決Project SDK is not defined問(wèn)題

    如何解決Project SDK is not defined問(wèn)題

    這篇文章主要介紹了如何解決Project SDK is not defined問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • mybatis自定義類型處理器的實(shí)現(xiàn)

    mybatis自定義類型處理器的實(shí)現(xiàn)

    在MyBatis使用中,有時(shí)需要對(duì)特定數(shù)據(jù)類型進(jìn)行定制處理,自定義類型處理器(TypeHandler)可以實(shí)現(xiàn)這一需求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • Springboot居然可以設(shè)置動(dòng)態(tài)的Banner(推薦)

    Springboot居然可以設(shè)置動(dòng)態(tài)的Banner(推薦)

    這篇文章主要介紹了Springboot居然可以設(shè)置動(dòng)態(tài)的Banner,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Java內(nèi)存各部分OOM出現(xiàn)原因及解決方法(必看)

    Java內(nèi)存各部分OOM出現(xiàn)原因及解決方法(必看)

    下面小編就為大家?guī)?lái)一篇Java內(nèi)存各部分OOM出現(xiàn)原因及解決方法(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04

最新評(píng)論