一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - springboot整合springsecurity與mybatis-plus的簡單實現

springboot整合springsecurity與mybatis-plus的簡單實現

2022-03-06 00:48remember_DL Java教程

Spring Security基于Spring開發,項目中如果使用Spring作為基礎,配合Spring Security做權限更加方便,而Shiro需要和Spring進行整合開發。因此作為spring全家桶中的Spring Security在java領域很常用

1、概述
Spring Security是一個功能強大且高度可定制的身份驗證和訪問控制框架。
它是用于保護基于Spring的應用程序的實際標準。
Spring Security是一個框架,致力于為Java應用程序提供身份驗證和授權。
與所有Spring項目一樣,Spring Security的真正強大之處在于可以輕松擴展以滿足自定義要求
springboot對于springSecurity提供了自動化配置方案,可以使用更少的配置來使用springsecurity
而在項目開發中,主要用于對用戶的認證和授權
官網:https://spring.io/projects/spring-security

2、數據庫使用Mysql,使用mybatis-plus框架

3、大致結構圖如下:

springboot整合springsecurity與mybatis-plus的簡單實現

控制器用HelloController就行,因為使用mybatis-plus代碼生成的有一些沒用的配置

4、使用依賴如下:

spring-boot用的2.1.18 RELEASE

springboot整合springsecurity與mybatis-plus的簡單實現

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

# 數據庫驅動:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 數據庫連接地址
spring.datasource.url=jdbc:mysql:///rog?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
# 數據庫用戶名&密碼:
spring.datasource.username=root
spring.datasource.password=root
#日志輸出,使用默認的控制臺輸出
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

#mybatis plus 設置
mybatis-plus.mapper-locations=classpath*:com/xxx/mapper/xml/*Mapper.xml

#配置別名掃描
mybatis-plus.type-aliases-package=com.xxx.entity

6、mysql數據庫

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

springboot整合springsecurity與mybatis-plus的簡單實現

springboot整合springsecurity與mybatis-plus的簡單實現

springboot整合springsecurity與mybatis-plus的簡單實現

7、entity-實體類大致如下:

springboot整合springsecurity與mybatis-plus的簡單實現

注意需要對應數據庫的id自動遞增

8、mapper包

springboot整合springsecurity與mybatis-plus的簡單實現

因為使用的mabits-plus代碼生成所以對應的mapper,所以生成好是繼承了BaseMapper,如果手動寫的話,就需要繼承BaseMapper

springboot整合springsecurity與mybatis-plus的簡單實現

查詢數據庫當前請求登錄的用戶,獲取他所擁有的所有權限

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);
      //根據頁面傳的用戶名查找數據庫判斷是否存在該用戶
      Users users = usersMapper.selectOne(wrapper);
      if (users==null){
          throw new UsernameNotFoundException("用戶不存在");
      }
      List<Role> roles = usersMapper.findRoles(users.getId());
      List<SimpleGrantedAuthority> authorities = new ArrayList<>();
      //遍歷當前用戶的角色集合組裝權限
      for (Role role : roles) {
          authorities.add(new SimpleGrantedAuthority(role.getName()));
      }
      return new User(username,users.getPassword(),authorities);//如果用戶沒有角色會NullPointerException
  }
}

需要實現 UserDetailsService接口重寫 loadUserByUsername方法,做了一個簡單邏輯

10、測試是否連接上了數據庫

springboot整合springsecurity與mybatis-plus的簡單實現

springboot整合springsecurity與mybatis-plus的簡單實現

新增一個用戶,數據新增成功返回row>0,表示已經連接數據庫成功

11、controller層寫一個簡單的控制器

springboot整合springsecurity與mybatis-plus的簡單實現

12、config包下配置一下權限認證框架配置

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

因為使用postman測試所有就沒有寫自定義頁面,如果自定義登錄界面需要配置一個靜態資源放行

springboot整合springsecurity與mybatis-plus的簡單實現

13、postman測試

springboot整合springsecurity與mybatis-plus的簡單實現

登錄需要使用post請求,和表單提交方式

右邊響應格式,如果你的實體沒有實現UserDetails接口,返回的json格式便是固定的

屬性對應分別是accountNonExpired、accountNonLocked、credentialsNonExpired、enabled 這四個屬性分別用來描述用戶的狀態,表示賬戶是否沒有過期、賬戶是否沒有被鎖定、密碼是否沒有過期、以及賬戶是否可用。

不需要任何授權即可訪問:

springboot整合springsecurity與mybatis-plus的簡單實現

需要用戶權限才能訪問:

springboot整合springsecurity與mybatis-plus的簡單實現

需要管理員權限才能訪問(當前登錄用戶沒有管理員權限所以他無法訪問當前頁面):

springboot整合springsecurity與mybatis-plus的簡單實現

注銷當前登錄用戶,會默認清除Cookies以及認證信息和使session失效,當然也可以在配置類中顯示配置一下

springboot整合springsecurity與mybatis-plus的簡單實現

springboot整合springsecurity與mybatis-plus的簡單實現

再次訪問頁面,就會提示先登錄在訪問

springboot整合springsecurity與mybatis-plus的簡單實現

以上就是Spring Security 簡單整合mybatis-plus大概的過程,個人覺得還算是比較詳細哈哈。。。

到此這篇關于springboot整合springsecurity與mybatis-plus的簡單實現的文章就介紹到這了,更多相關springboot整合spring security內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/remember_DL/article/details/120992467

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美日韩高清不卡一区二区三区 | 娇妻中日久久持久久 | 欧美日韩高清不卡一区二区三区 | 黄色大片网| 亚洲国产成人久久综合区 | 九九精品国产亚洲A片无码 九九99热久久999精品 | 色久久一个亚洲综合网 | 1024国产看片在线观看 | 日本人做受全过程视频 | 国内精品久久久久久久久久久久 | 精品国产品国语在线不卡丶 | 亚洲天天综合网 | s8sp加密路线和免费路线首页 | 青柠在线完整高清观看免费 | 黑人巨大videosjapan高清 黑人好大 | 日本黄视频在线播放 | 视频一区久久 | 精品麻豆国产 | 日韩免费在线视频观看 | 亚洲乱亚洲23p女 | 亚洲AV永久无码精品澳门 | 国产自产自拍 | 污文啊好棒棒啊好了 | 免费xxxx日本大片在线观看 | 国产91素人搭讪系列天堂 | 成人小视频在线免费观看 | 国产新疆成人a一片在线观看 | 免费操比视频 | 97在线资源站 | 精品国产免费 | 日韩精品一区二区三区中文字幕 | 久久足恋网 | 天天色视频| 9久re在线观看视频精品 | 国产免费一区二区三区 | 亚洲国产精品无码中文在线 | 美女脱一光二净的视频 | 丰满肥臀风间由美357在线 | 久久最新地址获取 | 操乳 | 日本一卡二卡3卡四卡无卡网址 |