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

Spring Boot中整合Spring Security并自定義驗(yàn)證代碼實(shí)例

 更新時(shí)間:2017年04月06日 15:15:38   作者:嗡湯圓  
本篇文章主要介紹了Spring Boot中整合Spring Security并自定義驗(yàn)證代碼實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

最終效果

1、實(shí)現(xiàn)頁面訪問權(quán)限限制
2、用戶角色區(qū)分,并按照角色區(qū)分頁面權(quán)限
3、實(shí)現(xiàn)在數(shù)據(jù)庫中存儲(chǔ)用戶信息以及角色信息
4、自定義驗(yàn)證代碼

效果如下:

1、免驗(yàn)證頁面

這里寫圖片描述 

2、登陸頁面

在用戶未登錄時(shí),訪問任意有權(quán)限要求的頁面都會(huì)自動(dòng)跳轉(zhuǎn)到登陸頁面。

這里寫圖片描述 

3、需登陸才能查看的頁面

用戶登陸后,可以正常訪問頁面資源,同時(shí)可以正確顯示用戶登錄名:

這里寫圖片描述 

4、用戶有角色區(qū)分,可以指定部分頁面只允許有相應(yīng)用戶角色的人使用

4.1、只有ADMIN覺得用戶才能查看的頁面(權(quán)限不足)

這里寫圖片描述 

4.2、只有ADMIN覺得用戶才能查看的頁面(權(quán)限滿足)

這里寫圖片描述

以下具體說明實(shí)現(xiàn)步驟。

代碼實(shí)現(xiàn)

MAVEN引入依賴

在pom.xml中引入spring security依賴

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

配置Spring Security

在Spring中,配置和使用Spring Security,在不需要修改太多流程細(xì)節(jié)的情況下僅需聲明好攔截規(guī)則,同時(shí)自定義驗(yàn)證過程中的主要實(shí)現(xiàn)接口(用戶信息UserDetails,用戶信息獲取服務(wù)UserDetailsService,驗(yàn)證工具AuthenticationProvider)即可。其余的流程將由Spring自動(dòng)接管,非常方便。

啟動(dòng)配置

在項(xiàng)目包下添加WebSecurityConfigurerAdapter 的具體實(shí)現(xiàn)類,實(shí)現(xiàn)Spring Security的啟動(dòng)配置

代碼如下:

@Configurable
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)//允許進(jìn)入頁面方法前檢驗(yàn)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  @Autowired
  private MyAuthenticationProvider provider;//自定義驗(yàn)證
  @Autowired
  private UserDetailsService userDetailsService;//自定義用戶服務(wù)
  @Autowired
  public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception{
  }


  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()

    .antMatchers(StaticParams.PATHREGX.NOAUTH, 
        StaticParams.PATHREGX.CSS,StaticParams.PATHREGX.JS,StaticParams.PATHREGX.IMG).permitAll()//無需訪問權(quán)限

    .antMatchers(StaticParams.PATHREGX.AUTHADMIN).hasAuthority(StaticParams.USERROLE.ROLE_ADMIN)//admin角色訪問權(quán)限

    .antMatchers(StaticParams.PATHREGX.AUTHUSER).hasAuthority(StaticParams.USERROLE.ROLE_USER)//user角色訪問權(quán)限

    .anyRequest()//all others request authentication
    .authenticated()
    .and()
    .formLogin().loginPage("/login").permitAll()
    .and()
    .logout().permitAll();
  }

  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    //將驗(yàn)證過程交給自定義驗(yàn)證工具
    auth.authenticationProvider(provider);
  }

URL攔截配置

URL攔截配置可以在上一小節(jié)的WebSecurityConfig 中配置,但是此方法適用于大方向上的配置,具體的特殊路徑也可以在@Controller的注解中具體配置。

如下:

  @ResponseBody
  @PreAuthorize("hasAuthority('"+StaticParams.USERROLE.ROLE_ADMIN+"')")//這里可以指定特定角色的用戶訪問權(quán)限
  @RequestMapping(value = "adminrequire", method = RequestMethod.GET)
  public String adminrequire(){
    return "HELLO from web but you should be admin";
  }

用戶、角色表

在本文例子中用戶和角色可以有一對(duì)多的關(guān)系因此可以將用戶和角色分成兩張表。有些例子將用戶和權(quán)限寫在同一張表上也是可以的。

/*用戶表*/
@Entity
@Table(name = "user")
public class SystemUser {

  @Id
  @Column(name = "id")
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  private String userName;
  private String password;

  public SystemUser(){}

  public SystemUser(SystemUser user){
    this.userName = user.getUserName();
    this.password = user.getPassword();
    this.id = user.getId();
  }

  public Long getId() {
    return id;
  }
  public void setId(Long id) {
    this.id = id;
  }
  public String getUserName() {
    return userName;
  }
  public void setUserName(String userName) {
    this.userName = userName;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
}
/*角色表*/
@Entity
@Table(name = "user_role")
public class UserRole {

  @Id
  @Column(name = "id")
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  private String role;
  private Long userId;
  public Long getId() {
    return id;
  }
  public void setId(Long id) {
    this.id = id;
  }
  public String getRole() {
    return role;
  }
  public void setRole(String role) {
    this.role = role;
  }
  public Long getUserId() {
    return userId;
  }
  public void setUserId(Long userId) {
    this.userId = userId;
  }
}



自定義驗(yàn)證

在Spring Boot的Spring Security的教程中默認(rèn)的用戶名、密碼、權(quán)限是在代碼中指定的

@Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
      .inMemoryAuthentication()
        .withUser("user").password("password").roles("USER");
  }

這顯然是不符合應(yīng)用需求的,所以我們需要提供自定義的AuthenticationProvider,并在上邊代碼中替換即可。在此之前,我們應(yīng)該重寫獲取用戶User和權(quán)限的方法。通過查詢相關(guān)資料和API,方法提供如下:

自定義UserDetails

UserDetails代表了Spring Security的用戶認(rèn)證實(shí)體,帶有用戶名、密碼、權(quán)限列表、過期特性等性質(zhì),可以自己聲明類實(shí)現(xiàn)UserDetails接口,如果不想自己聲明,也可以用SpringSecurity的默認(rèn)實(shí)現(xiàn)org.springframework.security.core.userdetails.User 本文例子中采用自定義類:

public class MyUserDetails extends SystemUser implements UserDetails{

  private List<UserRole> roles;

  public MyUserDetails(SystemUser user, List<UserRole> roles){
    super(user);
    this.roles = roles;
  }

  @Override
  public Collection<? extends GrantedAuthority> getAuthorities() {
    if(roles == null || roles.size() <1){
      return AuthorityUtils.commaSeparatedStringToAuthorityList("");
    }
    StringBuilder commaBuilder = new StringBuilder();
    for(UserRole role : roles){
      commaBuilder.append(role.getRole()).append(",");
    }
    String authorities = commaBuilder.substring(0,commaBuilder.length()-1);
    return AuthorityUtils.commaSeparatedStringToAuthorityList(authorities);
  }

  @Override
  public String getPassword() {
    return super.getPassword();
  }

  @Override
  public String getUsername() {
    return super.getUserName();
  }

  @Override
  public boolean isAccountNonExpired() {
    return true;
  }

  @Override
  public boolean isAccountNonLocked() {
    return true;
  }

  @Override
  public boolean isCredentialsNonExpired() {
    return true;
  }

  @Override
  public boolean isEnabled() {
    return true;
  }

}

自定義UserDetailsService

UserDetailsService提供了獲取UserDetails的方式,只要實(shí)現(xiàn)UserDetailsService接口即可,最終生成用戶和權(quán)限共同組成的UserDetails,在這里就可以實(shí)現(xiàn)從自定義的數(shù)據(jù)源中獲取用戶信息了:

@Service("MyUserDetailsImpl")
public class MyUserDetailsService implements UserDetailsService {
  @Resource(name = "SystemUserServiceImpl")
  private SystemUserService systemUserService;

  @Resource(name = "UserRoleServiceImpl")
  private UserRoleService userRoleService;

  @Override
  public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
    SystemUser user;
    try {
      user = systemUserService.findByName(userName);
    } catch (Exception e) {
      throw new UsernameNotFoundException("user select fail");
    }
    if(user == null){
      throw new UsernameNotFoundException("no user found");
    } else {
      try {
        List<UserRole> roles = userRoleService.getRoleByUser(user);
        return new MyUserDetails(user, roles);
      } catch (Exception e) {
        throw new UsernameNotFoundException("user role select fail");
      }
    }
  }
}

自定義AuthenticationProvider

AuthenticationProvider 提供用戶UserDetails的具體驗(yàn)證方式,在這里可以自定義用戶密碼的加密、驗(yàn)證方式等等。因?yàn)椴┪闹饕v的是如何引入Spring Security和如何自定義驗(yàn)證代碼,所以這里為了簡(jiǎn)便,我直接采用明文比較方式:

@Component
public class MyAuthenticationProvider implements AuthenticationProvider {

  @Autowired
  private MyUserDetailsService userService;

  /**
   * 自定義驗(yàn)證方式
   */
  @Override
  public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    String username = authentication.getName();
    String password = (String) authentication.getCredentials();
    MyUserDetails user = (MyUserDetails) userService.loadUserByUsername(username);
    if(user == null){
      throw new BadCredentialsException("Username not found.");
    }

    //加密過程在這里體現(xiàn)
    if (!password.equals(user.getPassword())) {
      throw new BadCredentialsException("Wrong password.");
    }

    Collection<? extends GrantedAuthority> authorities = user.getAuthorities();
    return new UsernamePasswordAuthenticationToken(user, password, authorities);
  }

  @Override
  public boolean supports(Class<?> arg0) {
    return true;
  }

}

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot開發(fā)之整合Mybatis詳解

    SpringBoot開發(fā)之整合Mybatis詳解

    這篇文章主要介紹了SpringBoot開發(fā)之整合Mybatis詳解,MyBatis是一個(gè)半自動(dòng)的ORM框架,它允許我們通過編寫SQL語句來操作數(shù)據(jù)庫,使用MyBatis,我們可以通過定義映射文件(XML文件)或使用注解的方式將Java對(duì)象與數(shù)據(jù)庫表進(jìn)行映射,需要的朋友可以參考下
    2023-09-09
  • java 輸出九九乘法表口訣的代碼

    java 輸出九九乘法表口訣的代碼

    這篇文章主要介紹了java 輸出9*9口訣的代碼,需要的朋友可以參考下
    2017-02-02
  • 一文詳解MVCC的執(zhí)行原理

    一文詳解MVCC的執(zhí)行原理

    MVCC是一種并發(fā)控制機(jī)制,用于解決數(shù)據(jù)庫并發(fā)訪問中,數(shù)據(jù)一致性問題,它通過在讀寫操作期間保存多個(gè)數(shù)據(jù)版本,以提供并發(fā)事務(wù)間的隔離性,本文將和大家簡(jiǎn)單聊聊MVCC的執(zhí)行原理,需要的朋友可以參考下
    2023-12-12
  • JavaGUI實(shí)現(xiàn)隨機(jī)單詞答題游戲

    JavaGUI實(shí)現(xiàn)隨機(jī)單詞答題游戲

    這篇文章主要為大家詳細(xì)介紹了JavaGUI實(shí)現(xiàn)隨機(jī)單詞答題游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • java編程實(shí)現(xiàn)根據(jù)EXCEL列名求其索引的方法

    java編程實(shí)現(xiàn)根據(jù)EXCEL列名求其索引的方法

    這篇文章主要介紹了java編程實(shí)現(xiàn)根據(jù)EXCEL列名求其索引的方法,涉及Java元素遍歷與數(shù)學(xué)運(yùn)算的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • Java讀取DBF文件(GBK編碼)的方法

    Java讀取DBF文件(GBK編碼)的方法

    在Java開發(fā)中,有時(shí)需要讀取DBF(dBase文件)格式的數(shù)據(jù)文件,而這些文件通常采用GBK(簡(jiǎn)體中文)編碼,本文將介紹如何使用Java讀取采用GBK編碼的DBF文件,需要的朋友可以參考下
    2024-11-11
  • Javaweb開發(fā)環(huán)境Myeclipse6.5 JDK1.6 Tomcat6.0 SVN1.8配置教程

    Javaweb開發(fā)環(huán)境Myeclipse6.5 JDK1.6 Tomcat6.0 SVN1.8配置教程

    這篇文章主要介紹了Javaweb開發(fā)環(huán)境Myeclipse6.5 JDK1.6 Tomcat6.0 SVN1.8配置教程,感興趣的小伙伴們可以參考一下
    2016-06-06
  • windows上nacos自啟動(dòng)的三種方法小結(jié)

    windows上nacos自啟動(dòng)的三種方法小結(jié)

    本文主要給大家介紹了windows上nacos自啟動(dòng)的三種方法,借助WinSW.exe添加到服務(wù)列表,修改nacos啟動(dòng)配置以及以開機(jī)"啟動(dòng)"方式——啟動(dòng)Nacos的startup.cmd這三種方法,文中通過圖文講解的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • SpringBoot壓縮png, jpg, jpeg, webp類型圖片的實(shí)現(xiàn)代碼

    SpringBoot壓縮png, jpg, jpeg, webp類型圖片的實(shí)現(xiàn)代碼

    這篇文章主要介紹了SpringBoot壓縮png, jpg, jpeg, webp類型圖片的實(shí)現(xiàn),文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-08-08
  • Java死鎖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java死鎖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    死鎖是兩個(gè)甚至多個(gè)線程被永久阻塞時(shí)的一種運(yùn)行局面,這種局面的生成伴隨著至少兩個(gè)線程和兩個(gè)或者多個(gè)資源。在這里我已寫好一個(gè)簡(jiǎn)單的程序,它將會(huì)引起死鎖方案然后我們就會(huì)明白如何分析它
    2017-06-06

最新評(píng)論

信阳市| 浮梁县| 浏阳市| 紫金县| 册亨县| 周口市| 名山县| 曲阳县| 荔浦县| 临泽县| 宝应县| 始兴县| 张家界市| 尤溪县| 华容县| 通道| 故城县| 八宿县| 台州市| 麻城市| 无为县| 蒙阴县| 连山| 佛山市| 于田县| 乌拉特后旗| 东乌| 大新县| 东方市| 惠来县| 镇平县| 阿尔山市| 桦甸市| 旺苍县| 喀喇沁旗| 天长市| 阿荣旗| 常山县| 中卫市| 七台河市| 岳池县|