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

springboot整合springsecurity與mybatis-plus的簡(jiǎn)單實(shí)現(xiàn)

 更新時(shí)間:2021年10月29日 08:56:14   作者:remember_DL  
Spring Security基于Spring開(kāi)發(fā),項(xiàng)目中如果使用Spring作為基礎(chǔ),配合Spring Security做權(quán)限更加方便,而Shiro需要和Spring進(jìn)行整合開(kāi)發(fā)。因此作為spring全家桶中的Spring Security在java領(lǐng)域很常用

1、概述
Spring Security是一個(gè)功能強(qiáng)大且高度可定制的身份驗(yàn)證和訪問(wèn)控制框架。
它是用于保護(hù)基于Spring的應(yīng)用程序的實(shí)際標(biāo)準(zhǔn)。
Spring Security是一個(gè)框架,致力于為Java應(yīng)用程序提供身份驗(yàn)證和授權(quán)。
與所有Spring項(xiàng)目一樣,Spring Security的真正強(qiáng)大之處在于可以輕松擴(kuò)展以滿足自定義要求
springboot對(duì)于springSecurity提供了自動(dòng)化配置方案,可以使用更少的配置來(lái)使用springsecurity
而在項(xiàng)目開(kāi)發(fā)中,主要用于對(duì)用戶的認(rèn)證和授權(quán)
官網(wǎng):https://spring.io/projects/spring-security

2、數(shù)據(jù)庫(kù)使用Mysql,使用mybatis-plus框架

3、大致結(jié)構(gòu)圖如下:

控制器用HelloController就行,因?yàn)槭褂胢ybatis-plus代碼生成的有一些沒(méi)用的配置

4、使用依賴如下:

spring-boot用的2.1.18 RELEASE

5、application.properties配置文件如下:

# 數(shù)據(jù)庫(kù)驅(qū)動(dòng):
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 數(shù)據(jù)庫(kù)連接地址
spring.datasource.url=jdbc:mysql:///rog?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
# 數(shù)據(jù)庫(kù)用戶名&密碼:
spring.datasource.username=root
spring.datasource.password=root
#日志輸出,使用默認(rèn)的控制臺(tái)輸出
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
 
#mybatis plus 設(shè)置
mybatis-plus.mapper-locations=classpath*:com/xxx/mapper/xml/*Mapper.xml
 
#配置別名掃描
mybatis-plus.type-aliases-package=com.xxx.entity

6、mysql數(shù)據(jù)庫(kù)

這里使用了3張表,分別是user、role、user_role

7、entity-實(shí)體類大致如下:

注意需要對(duì)應(yīng)數(shù)據(jù)庫(kù)的id自動(dòng)遞增

8、mapper包

因?yàn)槭褂玫膍abits-plus代碼生成所以對(duì)應(yīng)的mapper,所以生成好是繼承了BaseMapper,如果手動(dòng)寫的話,就需要繼承BaseMapper

查詢數(shù)據(jù)庫(kù)當(dāng)前請(qǐng)求登錄的用戶,獲取他所擁有的所有權(quán)限

9、service

@Service()
public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements IUsersService, UserDetailsService {
    @Autowired
    private UsersMapper usersMapper;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        QueryWrapper<Users> wrapper = new QueryWrapper<>();
        wrapper.eq("user_name",username);
        //根據(jù)頁(yè)面?zhèn)鞯挠脩裘檎覕?shù)據(jù)庫(kù)判斷是否存在該用戶
        Users users = usersMapper.selectOne(wrapper);
        if (users==null){
            throw new UsernameNotFoundException("用戶不存在");
        }
        List<Role> roles = usersMapper.findRoles(users.getId());
        List<SimpleGrantedAuthority> authorities = new ArrayList<>();
        //遍歷當(dāng)前用戶的角色集合組裝權(quán)限
        for (Role role : roles) {
            authorities.add(new SimpleGrantedAuthority(role.getName()));
        }
        return new User(username,users.getPassword(),authorities);//如果用戶沒(méi)有角色會(huì)NullPointerException
    }
}

需要實(shí)現(xiàn) UserDetailsService接口重寫 loadUserByUsername方法,做了一個(gè)簡(jiǎn)單邏輯

10、測(cè)試是否連接上了數(shù)據(jù)庫(kù)

新增一個(gè)用戶,數(shù)據(jù)新增成功返回row>0,表示已經(jīng)連接數(shù)據(jù)庫(kù)成功

11、controller層寫一個(gè)簡(jiǎn)單的控制器

12、config包下配置一下權(quán)限認(rèn)證框架配置

@Configuration
@MapperScan("com.xxx.mapper")
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;
 @Bean
    PasswordEncoder passwordEncoder() {
        //使用明文密碼:為了簡(jiǎn)單方便測(cè)試
        return NoOpPasswordEncoder.getInstance();
        //暗文密碼:會(huì)用salt加密
        // return new BCryptPasswordEncoder();
    }
 @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //設(shè)置注入的自定義認(rèn)證實(shí)現(xiàn)類userService,必須實(shí)現(xiàn)了UserDetailsService接口
        auth.userDetailsService(userDetailsService);
    }
@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                //.antMatchers需要寫在 .anyRequest()之前
               /* anyRequest 已經(jīng)包含了其他請(qǐng)求了,在它之后如果還配置其他請(qǐng)求也沒(méi)有任何意義。
                anyRequest 應(yīng)該放在最后,表示除了前面攔截規(guī)則之外,剩下的請(qǐng)求要如何處理。具體可以稍微查看一下源碼,
                在攔截規(guī)則的配置類 AbstractRequestMatcherRegistry 中*/
                .antMatchers("/admin/**").hasRole("admin")//以/admin作為前綴的請(qǐng)求必須具有admin權(quán)限才能訪問(wèn)(當(dāng)前也必須認(rèn)證通過(guò))
                .antMatchers("/user/**").hasRole("user")//以/user作為前綴的請(qǐng)求必須具有user權(quán)限才能訪問(wèn)(當(dāng)前也必須認(rèn)證通過(guò))
                .anyRequest().authenticated()//任何請(qǐng)求都認(rèn)證過(guò)放行
                .and()//方法表示結(jié)束當(dāng)前標(biāo)簽,上下文回到HttpSecurity,開(kāi)啟新一輪的配置。
                .formLogin()//使用表單認(rèn)證
                .loginProcessingUrl("/doLogin")//指定登錄頁(yè)面提交數(shù)據(jù)的接口
                .successHandler((req, resp, authentication) -> {
                    Object principal = authentication.getPrincipal();//獲取認(rèn)證成功的用戶對(duì)象
                    resp.setContentType("application/json;charset=utf-8");
                    PrintWriter out = resp.getWriter();
                    //使用Jackson將對(duì)象轉(zhuǎn)換為JSON字符串
                    out.write(new ObjectMapper().writeValueAsString(principal));//將登錄成功的對(duì)象基于JSON響應(yīng)
                    out.flush();
                    out.close();
                })
                .failureHandler((req, resp, e) -> {//根據(jù)異常信息判斷哪一操作出現(xiàn)錯(cuò)誤
                    resp.setContentType("application/json;charset=utf-8");
                    PrintWriter out = resp.getWriter();
                    Map<String, Object> map = new HashMap<String, Object>();
                    map.put("status", 400);
                    if (e instanceof LockedException) {
                        map.put("msg", "賬戶被鎖定,請(qǐng)聯(lián)系管理員!");
                    } else if (e instanceof CredentialsExpiredException) {
                        map.put("msg", "密碼過(guò)期,請(qǐng)聯(lián)系管理員!");
                    } else if (e instanceof AccountExpiredException) {
                        map.put("msg", "賬戶過(guò)期,請(qǐng)聯(lián)系管理員!");
                    } else if (e instanceof DisabledException) {
                        map.put("msg", "賬戶被禁用,請(qǐng)聯(lián)系管理員!");
                    } else if (e instanceof BadCredentialsException) {
                        map.put("msg", "用戶名或者密碼輸入錯(cuò)誤,請(qǐng)重新輸入!");
                    }
                    out.write(new ObjectMapper().writeValueAsString(map));
                    out.flush();
                    out.close();
                })
                .permitAll()//放行自定義登錄頁(yè)面請(qǐng)求
                .and()
                .logout()//默認(rèn)注銷接口/logout
                .logoutUrl("/logout")//默認(rèn)注銷的URL
                //基于前后端分離開(kāi)發(fā),前端發(fā)起/logout請(qǐng)求,后端自定義注銷成功處理邏輯:返回json提示成功
                .logoutSuccessHandler((req, resp, authentication) -> {
                    resp.setContentType("application/json;charset=utf-8");
                    PrintWriter out = resp.getWriter();
                    out.write("注銷成功");
                    out.flush();
                    out.close();
                })
                .permitAll()
                .and()
                .csrf().disable()//關(guān)閉csrf攻擊攔截
                //配置未認(rèn)證提示,給未認(rèn)證(登錄成功)訪問(wèn)其他請(qǐng)求時(shí),給前端響應(yīng)json提示
                .exceptionHandling()
                .authenticationEntryPoint((req, resp, authException) -> {
                            resp.setContentType("application/json;charset=utf-8");
                            PrintWriter out = resp.getWriter();
                            out.write("尚未登錄,請(qǐng)先登錄");
                            out.flush();
                            out.close();
                        }
                );
    }
}

因?yàn)槭褂胮ostman測(cè)試所有就沒(méi)有寫自定義頁(yè)面,如果自定義登錄界面需要配置一個(gè)靜態(tài)資源放行

13、postman測(cè)試

登錄需要使用post請(qǐng)求,和表單提交方式

右邊響應(yīng)格式,如果你的實(shí)體沒(méi)有實(shí)現(xiàn)UserDetails接口,返回的json格式便是固定的

屬性對(duì)應(yīng)分別是accountNonExpired、accountNonLocked、credentialsNonExpired、enabled 這四個(gè)屬性分別用來(lái)描述用戶的狀態(tài),表示賬戶是否沒(méi)有過(guò)期、賬戶是否沒(méi)有被鎖定、密碼是否沒(méi)有過(guò)期、以及賬戶是否可用。

不需要任何授權(quán)即可訪問(wèn):

需要用戶權(quán)限才能訪問(wèn):

需要管理員權(quán)限才能訪問(wèn)(當(dāng)前登錄用戶沒(méi)有管理員權(quán)限所以他無(wú)法訪問(wèn)當(dāng)前頁(yè)面):

注銷當(dāng)前登錄用戶,會(huì)默認(rèn)清除Cookies以及認(rèn)證信息和使session失效,當(dāng)然也可以在配置類中顯示配置一下

再次訪問(wèn)頁(yè)面,就會(huì)提示先登錄在訪問(wèn)

以上就是Spring Security 簡(jiǎn)單整合mybatis-plus大概的過(guò)程,個(gè)人覺(jué)得還算是比較詳細(xì)哈哈。。。

到此這篇關(guān)于springboot整合springsecurity與mybatis-plus的簡(jiǎn)單實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)springboot整合spring security內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?超詳細(xì)講解SpringMVC攔截器

    Java?超詳細(xì)講解SpringMVC攔截器

    Spring?MVC?的攔截器(Interceptor)與?Java?Servlet?的過(guò)濾器(Filter)類似,它主要用于攔截用戶的請(qǐng)求并做相應(yīng)的處理,通常應(yīng)用在權(quán)限驗(yàn)證、記錄請(qǐng)求信息的日志、判斷用戶是否登錄等功能上。本文將代碼演示和文字描述詳解攔截器的使用
    2022-04-04
  • Java案例使用比較排序器comparator實(shí)現(xiàn)成績(jī)排序

    Java案例使用比較排序器comparator實(shí)現(xiàn)成績(jī)排序

    這篇文章主要介紹了Java案例使用比較排序器comparator實(shí)現(xiàn)成績(jī)排序,主要通過(guò)案例用TreeSet集合存儲(chǔ)多個(gè)學(xué)生信息,并遍歷該集合,要按照總分從高到低進(jìn)行排序,下文介紹需要的朋友可以參考一下
    2022-04-04
  • 關(guān)于java的包Package中同名類的沖突及其理解

    關(guān)于java的包Package中同名類的沖突及其理解

    這篇文章主要介紹了關(guān)于java的包Package中同名類的沖突及其理解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java中向文件寫入數(shù)據(jù)的幾種常見(jiàn)方式分享

    Java中向文件寫入數(shù)據(jù)的幾種常見(jiàn)方式分享

    在日常開(kāi)發(fā)中,肯定離不開(kāi)要和文件打交道,今天就簡(jiǎn)單羅列一下平時(shí)比較常用的創(chuàng)建文件并向文件中寫入數(shù)據(jù)的幾種方式,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-10-10
  • java 數(shù)據(jù)結(jié)構(gòu)之堆排序(HeapSort)詳解及實(shí)例

    java 數(shù)據(jù)結(jié)構(gòu)之堆排序(HeapSort)詳解及實(shí)例

    這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)之堆排序(HeapSort)詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • SpringCloud組件OpenFeign之?dāng)r截器解讀

    SpringCloud組件OpenFeign之?dāng)r截器解讀

    這篇文章主要介紹了SpringCloud組件OpenFeign之?dāng)r截器用法。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 詳解Java拋出和聲明異常的代碼實(shí)現(xiàn)

    詳解Java拋出和聲明異常的代碼實(shí)現(xiàn)

    我們?cè)诰帉懘a時(shí),有時(shí)候因?yàn)槟承┰?并不想在這個(gè)方法中立即處理產(chǎn)生的異常,也就是說(shuō)并不想進(jìn)行異常的捕獲,接下來(lái)小編就來(lái)教會(huì)大家該如何進(jìn)行異常的拋出,需要的朋友可以參考下
    2023-08-08
  • SpringBoot集成Mybatis實(shí)現(xiàn)對(duì)多數(shù)據(jù)源訪問(wèn)原理

    SpringBoot集成Mybatis實(shí)現(xiàn)對(duì)多數(shù)據(jù)源訪問(wèn)原理

    本文主要分析討論在SpringBoot應(yīng)用中我們?cè)撊绾闻渲肧qlSessionFactoryBean對(duì)象,進(jìn)而實(shí)現(xiàn)對(duì)多個(gè)不同的數(shù)據(jù)源的操縱,文章通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Java中List集合按指定條件排序

    Java中List集合按指定條件排序

    這篇文章主要介紹了Java中List集合按指定條件排序,List是一種有序集合,可以隨時(shí)添加和刪除其中元素,本篇文章針對(duì)List集合按照條件排序的幾種方式做了實(shí)例演示,需要的朋友可以參考下
    2023-07-07
  • TK-MyBatis 分頁(yè)查詢的具體使用

    TK-MyBatis 分頁(yè)查詢的具體使用

    分頁(yè)查詢?cè)诤芏嗟胤蕉伎梢允褂玫?,本文就詳?xì)的介紹了一下TK-MyBatis 分頁(yè)查詢的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12

最新評(píng)論