最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springsecurity輕松實(shí)現(xiàn)角色權(quán)限的示例代碼

 更新時(shí)間:2020年03月26日 10:34:40   作者:怡蘅  
這篇文章主要介紹了springsecurity輕松實(shí)現(xiàn)角色權(quán)限的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

問(wèn)題:

如何在springboot項(xiàng)目中使用springsecurity去實(shí)現(xiàn)角色權(quán)限管理呢?本文將盡可能簡(jiǎn)單的一步步實(shí)現(xiàn)對(duì)接口的角色權(quán)限管理。

項(xiàng)目框架:

sql:

user表:

CREATE TABLE `user` (
 `Id` int NOT NULL AUTO_INCREMENT,
 `UserName` varchar(255) NOT NULL,
 `CreatedDT` datetime DEFAULT NULL,
 `Age` int DEFAULT NULL,
 `Gender` int DEFAULT NULL,
 `Password` varchar(255) NOT NULL,
 PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

role表:

CREATE TABLE `role` (
 `Id` int NOT NULL AUTO_INCREMENT,
 `UserId` int DEFAULT NULL,
 `Role` varchar(255) DEFAULT NULL,
 `CreatedDT` datetime DEFAULT NULL,
 PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

maven:

在pom.xml中加入

   <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
    <!--SpringSecurity依賴(lài)配置-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <!--Hutool Java工具包-->
    <dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>4.5.7</version>
    </dependency>

model:

實(shí)體類(lèi)User要實(shí)現(xiàn)springsecurity的基本接口UserDetails,UserDetails里繼承了Serializable,不用擔(dān)心序列化

@Data 
public class User implements UserDetails { 
​ 
 public User() { 
 } 
​ 
 private static final long serialVersionUID = 1L; 
  
 private Integer id; 
​ 
 private String userName; 
​ 
 private Date createdDT; 
​ 
 private Integer age; 
​ 
 private Integer gender; 
​ 
 private String passWord; 
​ 
 private String role; 
​ 
 private List<GrantedAuthority> authorities; 
​ 
 public User(String userName, String passWord, List<GrantedAuthority> authorities) { 
 this.userName = userName; 
 this.passWord = passWord; 
 this.authorities = authorities; 
 } 
​ 
 @Override 
 public Collection<? extends GrantedAuthority> getAuthorities() { 
 return authorities; 
 } 
​ 
 @Override 
 public String getPassword() { 
 return this.passWord; 
 } 
​ 
 @Override 
 public String getUsername() { 
 return this.userName; 
 } 
​ 
 @Override 
 public boolean isAccountNonExpired() { 
 return true; 
 } 
​ 
 @Override 
 public boolean isAccountNonLocked() { 
 return true; 
 } 
​ 
 @Override 
 public boolean isCredentialsNonExpired() { 
 return true; 
 } 
​ 
 @Override 
 public boolean isEnabled() { 
 return true; 
 } 
} 

實(shí)體類(lèi)role:

@Data 
public class Role implements Serializable { 
 private Integer id; 
​ 
 private String role; 
​ 
 private Date createdDT; 
​ 
 private Integer userId; 
} 

mapper:

@Mapper 
public interface UserMapper{ 
 User selectOneByName(User user); 
}

service:

public interface UserService{ 
 User selectOneByName(User user) throws ServiceException; 
}

serviceImpl:

@Service 
public class UserServiceImpl implements UserService { 
 @Autowired 
 private UserMapper mapper; 
​ 
 @Override 
 public User selectOneByName(User user) throws ServiceException { 
 return mapper.selectOneByName(user); 
 } 
}

mapper.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
<mapper namespace="com.pzh.hyh.demo.mapper.UserMapper"><!--  mapper相對(duì)路徑--> 
 <resultMap id="BaseResultMap" type="com.pzh.hyh.demo.model.User"><!--  model相對(duì)路徑--> 
 <result column="Id" jdbcType="INTEGER" property="id"/> 
 <result column="UserName" jdbcType="VARCHAR" property="userName"/> 
 <result column="CreatedDT" jdbcType="TIMESTAMP" propert="createdDT"/> 
 <result column="Age" jdbcType="INTEGER" property="age"/> 
 <result column="Gender" jdbcType="INTEGER" property="gender"/> 
 <result column="Password" jdbcType="VARCHAR" property="passWord"/> 
 </resultMap> 
​ 
 <sql id="Base_Column_List"> 
 Id, UserName, CreatedDT, Age, Gender,Password 
 </sql> 
  
 <select id="selectOneByName" parameterType="com.pzh.hyh.demo.model.User" resultMap="BaseResultMap"><!--  model相對(duì)路徑--> 
 SELECT u.*,r.role FROM `user` u LEFT JOIN role r on u.Id = r.UserId 
 where u.UserName = #{userName,jdbcType=VARCHAR} 
 </select> 
​ 
</mapper> 

config:

首先實(shí)現(xiàn)UserDetailsService類(lèi)。自定義獲取用戶(hù)信息和角色信息。

@Component 
public class CustomUserDetailsService implements UserDetailsService { 
 @Autowired 
 private UserService userService; 
​ 
 @Autowired 
 private HttpServletRequest request; 
​ 
 @Override 
 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
 // 通過(guò)用戶(hù)名從數(shù)據(jù)庫(kù)獲取用戶(hù)信息 
 User user = userService.selectOneByName(new User(){ 
 { 
 setUserName(username); 
 } 
 }); 
 if (user == null) { 
 throw new UsernameNotFoundException("用戶(hù)不存在"); 
 } 
​ 
 HttpSession session = request.getSession(); 
 session.setAttribute(session.getId(),user); 
​ 
 // 得到用戶(hù)角色 
 String role = user.getRole(); 
​ 
 // 角色集合 
 List<GrantedAuthority> authorities = new ArrayList<>(); 
 // 角色必須以`ROLE_`開(kāi)頭,數(shù)據(jù)庫(kù)中沒(méi)有,則在這里加 
 authorities.add(new SimpleGrantedAuthority("ROLE_" + role)); 
​ 
 return new User( 
 user.getUsername(), 
 user.getPassword(), 
 authorities 
 ); 
 } 
}

自定義錯(cuò)誤提示

@Component 
public class MyAccessDeniedHandler implements AccessDeniedHandler { 
 @Override 
 public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { 
 response.setCharacterEncoding("UTF-8"); 
 response.setContentType("application/json"); 
 response.getWriter().println("{'code':'403','message':'沒(méi)有訪(fǎng)問(wèn)權(quán)限'}"); 
 response.getWriter().flush(); 
 } 
}

終于來(lái)到security的配置了

@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
 @Autowired 
 private CustomUserDetailsService userDatailService; 
​ 
 @Autowired 
 private MyAccessDeniedHandler accessDeniedHandler; 
​ 
 @Bean 
 public PasswordEncoder passwordEncoder(){ 
 return new BCryptPasswordEncoder(); 
 } 
​ 
 @Override 
 protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
 auth 
 .userDetailsService(userDatailService) 
 .passwordEncoder(passwordEncoder()); 
 } 
​ 
​ 
 @Override 
 protected void configure(HttpSecurity http) throws Exception { 
 http 
 .headers().frameOptions().disable() 
 .and() 
 .authorizeRequests() 
 .antMatchers("不限制訪(fǎng)問(wèn)的路徑,如:'/user/*'").permitAll() 
 .antMatchers("用戶(hù)擁有規(guī)定角色才允許訪(fǎng)問(wèn)的路徑,如:'/user/delte'").hasRole("admin") 
 .antMatchers("規(guī)定ip才允許訪(fǎng)問(wèn)的路徑,如:'/*'").hasIpAddress("192.168.1.1/24"); 
 .anyRequest().authenticated() // 所有請(qǐng)求都需要驗(yàn)證 
 .and() 
 // 跳轉(zhuǎn)自定義成功頁(yè) 
 .formLogin().defaultSuccessUrl("/html/index.html") 
 .and() 
 .exceptionHandling() 
 //用戶(hù)無(wú)權(quán)限訪(fǎng)問(wèn)鏈接,給出友好提示 
 .accessDeniedHandler(accessDeniedHandler) 
 .and() 
 .csrf().disable();// post請(qǐng)求要關(guān)閉csrf驗(yàn)證,不然訪(fǎng)問(wèn)報(bào)錯(cuò);實(shí)際開(kāi)發(fā)中要開(kāi)啟。 
 } 
}

至此,springsecurity的角色權(quán)限管理就完成了,如果想要實(shí)現(xiàn)方法級(jí)的角色權(quán)限限制,可以在方法前加入 @PreAuthorize("hasRole('角色')")注解,多個(gè)角色可以使用hasAnyRole(),就可以限制擁有規(guī)定角色權(quán)限的用戶(hù)才能訪(fǎng)問(wèn)了。

 @PreAuthorize("hasRole('admin')") 
 @RequestMapping(value = "/delete") 
 public CommonResult delete(@RequestBody int id) { 
   int i = userService.delete(new User() { 
   { 
    setId(id); 
   } 
   }); 
   return i > 0 ? processSuccess("刪除成功") : processFailure("刪除失敗"); 
 }

到此這篇關(guān)于springsecurity輕松實(shí)現(xiàn)角色權(quán)限的示例代碼的文章就介紹到這了,更多相關(guān)springsecurity 角色權(quán)限內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java網(wǎng)絡(luò)編程之UDP協(xié)議詳細(xì)解讀

    Java網(wǎng)絡(luò)編程之UDP協(xié)議詳細(xì)解讀

    這篇文章主要介紹了Java網(wǎng)絡(luò)編程之UDP協(xié)議詳細(xì)解讀,UDP協(xié)議全稱(chēng)是用戶(hù)數(shù)據(jù)報(bào)協(xié)議,在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無(wú)連接的協(xié)議,在OSI模型中,在第四層——傳輸層,處于IP協(xié)議的上一層,需要的朋友可以參考下
    2023-12-12
  • SpringBoot中日志切面實(shí)現(xiàn)小結(jié)

    SpringBoot中日志切面實(shí)現(xiàn)小結(jié)

    本文介紹了SpringBoot中日志切面實(shí)現(xiàn)小結(jié),通過(guò)定義一個(gè)自定義注解和創(chuàng)建一個(gè)日志切面類(lèi),為方法添加日志記錄功能,感興趣的可以了解一下
    2024-11-11
  • 新手了解java 集合基礎(chǔ)知識(shí)

    新手了解java 集合基礎(chǔ)知識(shí)

    今天小編就為大家分享一篇關(guān)于Java集合總結(jié),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧,希望對(duì)你有所幫助
    2021-07-07
  • Java利用多線(xiàn)程復(fù)制文件

    Java利用多線(xiàn)程復(fù)制文件

    這篇文章主要介紹了Java利用多線(xiàn)程復(fù)制文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Mybatis逆向工程筆記小結(jié)

    Mybatis逆向工程筆記小結(jié)

    MyBatis官方為我們提供了一個(gè)逆向工程,通過(guò)這個(gè)逆向工程,只需要建立好數(shù)據(jù)表,MyBatis就會(huì)根據(jù)這個(gè)表自動(dòng)生成pojo類(lèi)、mapper接口、sql映射文件,本文主要介紹了Mybatis逆向工程筆記小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • Java設(shè)計(jì)模式之單例模式簡(jiǎn)介

    Java設(shè)計(jì)模式之單例模式簡(jiǎn)介

    這篇文章主要介紹了Java設(shè)計(jì)模式之單例模式簡(jiǎn)介,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)Java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Spring配置文件解析之BeanDefinitionReader詳解

    Spring配置文件解析之BeanDefinitionReader詳解

    這篇文章主要介紹了Spring配置文件解析之BeanDefinitionReader詳解,ApplicationContext.xml配置文件解析成Document對(duì)象,真正對(duì)xml中元素解析的類(lèi)是在BeanDefinitionDocumentReader的實(shí)現(xiàn)類(lèi)中來(lái)完成的,需要的朋友可以參考下
    2024-02-02
  • 分布式醫(yī)療掛號(hào)系統(tǒng)SpringCache與Redis為數(shù)據(jù)字典添加緩存

    分布式醫(yī)療掛號(hào)系統(tǒng)SpringCache與Redis為數(shù)據(jù)字典添加緩存

    這篇文章主要為大家介紹了分布式醫(yī)療掛號(hào)系統(tǒng)SpringCache與Redis為數(shù)據(jù)字典添加緩存,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • Ubuntu 15下安裝JDK1.8教程

    Ubuntu 15下安裝JDK1.8教程

    這篇文章主要為大家詳細(xì)介紹了Ubuntu 15下JDK1.8安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • SpringBoot2.X Devtools熱部署實(shí)現(xiàn)解析

    SpringBoot2.X Devtools熱部署實(shí)現(xiàn)解析

    這篇文章主要介紹了SpringBoot2.X Devtools熱部署實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論

洛阳市| 阿荣旗| 宣威市| 聂拉木县| 福泉市| 中宁县| 高碑店市| 家居| 万山特区| 凭祥市| 汾阳市| 揭阳市| 乐昌市| 民勤县| 惠州市| 永和县| 云霄县| 申扎县| 多伦县| 柘荣县| 平南县| 贺兰县| 江都市| 博白县| 卓尼县| 大连市| 女性| 利辛县| 上高县| 溧水县| 松阳县| 佛山市| 南丰县| 浮梁县| 额济纳旗| 克山县| 广灵县| 三原县| 板桥市| 行唐县| 利川市|