当前位置: 移动技术网 > IT编程>开发语言>Java > Spring Boot2.0使用Spring Security的示例代码

Spring Boot2.0使用Spring Security的示例代码

2019年07月19日  | 移动技术网IT编程  | 我要评论
一、spring secutity简介 spring 是一个非常流行和成功的 java 应用开发框架。spring security 基于 spring 框架,提供了一套

一、spring secutity简介

spring 是一个非常流行和成功的 java 应用开发框架。spring security 基于 spring 框架,提供了一套 web 应用安全性的完整解决方案。一般来说,web 应用的安全性包括用户认证(authentication)和用户授权(authorization)两个部分。用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。

对于上面提到的两种应用情景,spring security 框架都有很好的支持。在用户认证方面,spring security 框架支持主流的认证方式,包括 http 基本认证、http 表单验证、http 摘要认证、openid 和 ldap 等。在用户授权方面,spring security 提供了基于角色的访问控制和访问控制列表(access control list,acl),可以对应用中的领域对象进行细粒度的控制。

另外spring security也集成了oauth2.0,接下来我们就介绍下这两种使用的,当然spring security还集成cas等等,如果你要了解更多请查看 官方文档 ,我们下面的都是使用spring boot2.0做的demo,2.0以后已经集成了spring security5.0以上的版本;

二、basic认证

这个也是我们经常使用的基于表单的认证,输入一个账号和密码点击登录这种,就是basic认证,我们接下主要会讲一下使用以及5.0以后做了那些升级;

1.使用以及常用的一些参数的介绍

第一步使用maven引入spring security jia包,这里我们使用thymeleaf作为前端模板页面,这里也有一个地方可以探讨一波,为什么spring mvc可以自由切换模板,这个地方我们找个机会一起探讨,这里先做下简单的介绍;

<dependencies>
 <dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter</artifactid>
 </dependency>
 <dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-security</artifactid>
 </dependency>
 <!-- 前端模板 thymeleaf 依赖 -->
 <dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-thymeleaf</artifactid>
 </dependency>
 <!--安全认证框架-->
 <dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-web</artifactid>
 </dependency>
 <dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-test</artifactid>
  <scope>test</scope>
 </dependency>
 <dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-thymeleaf</artifactid>
 </dependency>
 <dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-security</artifactid>
 </dependency>
 </dependencies>

第二步引入java配置配置方案

这里我们先使用@configuration和@enablewebsecurity对java类进行配置,接下来我们就是继承websecurityconfigureradapter,对里面的方法重写就可以了,分别是对authenticationmanagerbuilder,websecurity,httpsecurity方法,我们主要介绍authenticationmanagerbuilder和httpsecurity,通过对这两种方法重写最终实现我们自定义认证;

先来介绍一下httpsecurity常用参数,如下图用法基本脱离不了下面这些方法,可以基于认证的方式有formlogin、openidlogin、oauth2login,还可以做一些记住账号操作rememberme,还可以进行session配置管理,还支持登出loginout等等,使用起来还是蛮简单的,大家可以参照一下,还是蛮详细的;

接下来我们再看下authenticationmanagerbuilder,我们重写这个方法,可以基于内存用户认证、数据库认证、ldap认证、还可以自定义用户服务、还可以自己定义认证。这里我们使用自定义认证的做demo,另外这个大家还可能有一个困惑的点,configglobal和configure的差别在哪里,这里大家可以 ,spring security从3.2版本以后就默认开启了crsf防护,这里是通过token方式去检测的,在登陆的时候thymeleaf模板会生成_csrf的标签来防止crsf,对csrf不懂的大家可以看下 ,这个里面介绍一些防护csrf的手段,大家可以思考下,我的demo只是一个简单的架子,为了是给大家介绍一些知识,可扩展大家根据这些介绍的知识可以随心所欲的扩展自己想要的,不要拘泥于一种方法;

最后我还要介绍一下加密的方式,spring security 4的时候我们常用的加密方式是md5加盐的方式,5.0以后版本就找不到md5passwordencoder,说明这个方法还是不够安全,还是可以通过暴力破解可以搞定,可能我不行但是拦不住一些高手,大家可以看下官方支持的以及弃用一些方法:

使用我就不介绍了,有兴趣可以自己探索一波,还可以参考一下 、,下面我粘贴我的代码,讲到的这些可以扩展的地方大家我在代码中会标识清楚,喜欢动手可以尝试一下,我的重点是oauth2验证;

/**
 *自定义认证
 * created by wangt on 2018/7/29.
 */
@configuration
@enablewebsecurity
@enableglobalmethodsecurity
public class websecurityconfig extends websecurityconfigureradapter {

 /**
 * http资源认证
 * @param http
 * @throws exception
 */
 @override
 protected void configure(httpsecurity http) throws exception {
 http.authorizerequests()
  .antmatchers("/","/home").permitall()
  .anyrequest().authenticated()
  .and()
  .formlogin()
  .loginpage("/login")
  .permitall()
  .and()
  .logout()
  .permitall();
 }

 /**
 * 自定义认证策略
 */
 @autowired
 public void configglobal(authenticationmanagerbuilder auth) throws exception {
 auth.authenticationprovider(authprovider()).erasecredentials(true);
 }

 @bean
 public authprovider authprovider(){
 return new authprovider();
 }
}


/**
 * 自定义认证
 * created by wangt on 2018/8/18.
 */
public class authprovider implements authenticationprovider {
 private final bcryptpasswordencoder bcryptpasswordencoder=new bcryptpasswordencoder();

 @override
 public authentication authenticate(authentication authentication) throws authenticationexception {
 string username = authentication.getname();
 string inputpassword = (string) authentication.getcredentials();

 //如果你要使用thymeleaf认证方言可以扩展一下user
 //grantedauthority这个是使用方言的属性,有兴趣了解下
 //其实也就是通过这个使用if去判断
 user user =new user();
 user.setname("admin");
 user.setpassword("admin");
 if (user == null) {
  throw new authenticationcredentialsnotfoundexception("autherror");
 }

 //这一块可以自定义一些加密方式
 //自己动手实现一下
 if (true) {
  //这块有好几个构造
  //如果使用方言你可以使用3个参数的构造函数
  return new usernamepasswordauthenticationtoken(user, null);

 }

 throw new badcredentialsexception("autherror");
 }

 @override
 public boolean supports(class<?> aclass) {
 return true;
 }
}


/**
 * created by wangt on 2018/8/18.
 */
@configuration
public class webmvcconfig implements webmvcconfigurer {
 
 //如果使用thymeleaf方言在这块扩展
 

 @override
 public void addviewcontrollers(viewcontrollerregistry registry) {
 registry.addviewcontroller("/index").setviewname("index");
 registry.addviewcontroller("/").setviewname("index");
 registry.addviewcontroller("/hello").setviewname("hello");
 registry.addviewcontroller("/login").setviewname("login");
 }
}


<!doctype html>
<html lang="en">
<head>
 <meta charset="utf-8">
 <title>title</title>
</head>
<body>
<!--主页面 index-->
您好!欢迎光临!
<a href="/login">登录</a>
<a href="/hello">限制访问的页面</a>
</body>
</html>


<!doctype html>
<html lang="en">
<head>
 <meta charset="utf-8">
 <title>title</title>
</head>
<body>
<!--hello页面-->
hello
</body>
</html>

<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
 <meta charset="utf-8">
 <title>title</title>
</head>
<body>
<!--登录页面-->
<form th:action="@{/login}" method="post">
 <div><label> user name : <input type="text" name="username"/> </label></div>
 <div><label> password: <input type="password" name="password"/> </label></div>
 <div><input type="submit" value="登录"/></div>
</form>

</body>
</html>

/**
 * 登录控制器
 * created by wangt on 2018/8/18.
 */
@controller
public class logincontroller {

 @getmapping("/login")
 public string login(){
 return "/login";
 }

}

/**
 * 主页
 * created by wangt on 2018/7/28.
 */
@controller
public class homecontroller {

 @getmapping("/")
 public string index(){
  return "index";
 }
}

/**
 * hello页
 * created by wangt on 2018/8/19.
 */
@controller
public class hellocontroller {

 @getmapping("/hello")
 public string index(){
 return "hello";
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网