一.首先在idea中创建maven项目
记得一定要保持网络通常
这里根据实际情况取,跟我一样也行,设置完后点右下角的next
第一个是你的项目名,第二个是你要存的地址,设置完后点finish
1.向pom.xml文件添加依赖
项目创建之后先向项目结构最下面的pom.xml文件添加依赖
第一次添加依赖的时候要等待一段时间才不暴红,如果下面没有进度条还是爆红,可能是你的maven的镜像源有问题或者是你没联网
<dependencies>
<!-- SpringBoot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.10.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.10.RELEASE</version>
</dependency>
<!-- Thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.1.10.RELEASE</version>
</dependency>
<!--Spring Security-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.1.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
<!--json-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
<scope>compile</scope>
</dependency>
</dependencies>
2.在resources下创建application.yml文件,并配置yml的端口号:(如果自己项目的端口号不冲突也可以不用配置)
可以自己取,只要端口号不要被占用,注意:后要有空格,port不能和server同一列(两个并排)
3.创建要测试的html页面main.html
再在resources里创建templates文件夹,再在这个文件夹创建main.html网页
4.创建控制层controller
小写字母开头的是包名,大写字母创建的是类名,这是快速创建包和类的一种方式。下面这个图就是包名.包名.类名
这里的string返回方式有几种, 这里的 return “main”是指要跳向的页面为main,所以不能用@RestController注解修饰类,也不能用@ResponseBody修饰方法。
@Controller
public class SecurityController {
@RequestMapping("/main")
public String main(){
return "main";
}
}
5.创建启动类父类
springboot需要创建一个启动类,记得这个启动类所处的包一定是最高级的,比如一个类的包的位置是,那你的启动类的位置就必须是com,也可以说是点少的是老大(哈哈哈)。
//启动类的代码
@SpringBootApplication
public class SecurityMain {
public static void main(String[] args) {
SpringApplication.run(SecurityMain.class,args);
}
}
6.运行项目
搭建完了看一下运行咋样把
6.1.启动启动类
启动下启动类看看
6.2.地址栏输入
在自己的浏览器上面的地址栏输入localhost:8181(这是我上面yml配的,没配应该是8080)/main,"/main"这是你在控制层的url,自己随便取得。
6.3.来到Spring Security自带的登录
如果成功了就来到了Spring Security自带的登录界面,用户名默认是user,密码在你idea的控制台里能看
密码在这里
登陆:
最后成功运行的效果:
二.自定义认证逻辑
如果我们没有进行任何的配置,账号和密码是由Spring Security定义生成的,那跟实际情况严重不符合,所以我们要自己去定义谁能登录,然后有啥权限等。
1.创建配置类
我们先自己创建·一个配置类,可以随便取,但是为了规范和以后好识别类的作用,我们先创建一个SecurityConfig配置类,创建方法和上面一样。
代码:
@Configuration
public class SecurityConfig {
@Bean /* security框架要求密码必须是加密的处理,推荐的是BCryptPasswordEncoder()这种方式*/
public PasswordEncoder getPwdEncoder(){
return new BCryptPasswordEncoder();
}
}
2.创建业务实现类
再创建业务类(这里没有创建接口,下面业务实现类后面的接口是自带的)
后面那个UserDetailsService这个接口不是自己创立的,而是自带的,如果爆红就import
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private PasswordEncoder encoder;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//1. 查询数据库判断用户名是否存在,如果不存在抛出UsernameNotFoundException
if(!username.equals("admin")){
throw new UsernameNotFoundException("用户名不存在");
}
//把查询出来的密码进行解析,或直接把password放到构造方法中。
//理解:password就是数据库中查询出来的密码,查询出来的内容不是123
String password = encoder.encode("123");
return new User(username,password, AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
}
}
下面那个new User 记得别导错包了!
new User()里的参数-》用户,密码,权限
3.启动项目
然后启动项目,用户和密码是刚刚你在idea写的。
登陆失败
三.自定义登录界面
我们用的这个登录界面是这个框架自己带的,那肯定以后是要自己写的,所以我们现在要开始创建属于自己的登录界面了。
1.创建属于自己的登录界面
方法必须是post
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
2.对自己定义的配置类做修改
让你之前的配置文件类继承WebSecurityConfigurerAdapter
然后右键选择Generate,再选择override methods,然后选择
这里选的是有http的configure,一定不要选择错了
然后在这个方法里添加以下代码
http.formLogin()
.loginProcessingUrl("/login")//要访问下面的(比如说要访问/main), .loginProcessingUrl括号里的路径一定是第一个出现的
//此处表单不写action属性也可以 //当发现/login时认为是登录,需要执行UserDetailsServiceImpl
.successForwardUrl("/main") //此处是post请求,提交成功之后往哪去
.loginPage("/login.html");//登陆失败去哪
// url 拦截
http.authorizeRequests()
.antMatchers("/login.html").permitAll() //login.html不需要被认证放行
.anyRequest().authenticated();//所有的请求都必须被认证。必须登录后才能访问。
//关闭csrf防护
http.csrf().disable();
3.启动项目
搞完上面的就开始启动项目,这次跳转的页面就是我们自己设计的页面了。
四.持久化登录
说白了就是把用户数据存起来,然后我们下次不用再输入用户名和密码登录了。
1.创建mysql数据库
首先我们先要准备一个数据库,我这用的是mysql数据库,操作数据库的软件是Navicat Premium 16
我们先创建一个数据库名字必须叫security
双击security数据库(或者右键打开它),从灰变成绿色,在右键新建查询
再在查询里输入创建表的语句,然后右上角运行
create table persistent_logins (
username varchar(64) not null,
series varchar(64) primary key,
token varchar(64) not null,
last_used timestamp not null)
下面显示运行成功,然后我们刷新或者退出重进。
这个数据库表一开始空的,记住。
2.再次修改配置文件和创建新配置文件类
然后在idea的application.yml添加你数据库的信息。
driver-class-name 这个跟你的数据库版本有关,我这里用的8版本
username:你的mysql数据库的用户名,如果你不改一般是root
password:你的mysql数据库的密码
url 前面的jdbc:mysql应该是一样的,后面的3306默认(可以去你安装的mysql的路径下找my.ini,右键打开方式记事本打开,然后看看port端口是啥这里就是啥),security是你的数据库的名字
3.怎么查看自己mysql的端口号(知道的可以跳过这一步)
一直查找下一个,找到就行了,这个3306就是你mysql数据库的端口号了。
3.向pom.xml添加数据库依赖
<!-- 4.添加mysql数据库的驱动包依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<!-- 3.添加Mybatis 的启动器依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
4.再次创建一个配置类RememberMeConfig
要是DataSource红了就点它会有个import class的选项,点它就行了。
@Configuration
public class RememberMeConfig {
@Autowired
private DataSource dataSource;
@Bean
public PersistentTokenRepository getPersistentTokenRepository() {
JdbcTokenRepositoryImpl jdbcTokenRepositoryImpl=new JdbcTokenRepositoryImpl();
jdbcTokenRepositoryImpl.setDataSource(dataSource);
//自动建表,第一次启动时需要,第二次启动时注释掉
//jdbcTokenRepositoryImpl.setCreateTableOnStartup(true); //该代码不好用,使用sql手动创建库,表
return jdbcTokenRepositoryImpl;
}
}
5.修改 之前创建的SecurityConfig 配置文件 类。
下面这俩放这个SecurityConfig 配置文件 类里面的最上面
@Autowired
PersistentTokenRepository repository;
// private RememberMeConfig repository;
@Autowired
private UserDetailsServiceImpl userDetailsService;
下面这个放configure这个方法里
http.rememberMe()
.userDetailsService(userDetailsService) //登录逻辑交给哪个对象
.tokenRepository(repository); //持久层对象
然后再来到你自己制作的登陆界面(login.html)添加
<input type="checkbox" name="remember-me" value="true"/> <br/>
6.启动项目
红圈里勾上,然后点提交
7.查看数据库情况
去数据库的表里查看时,多了一个username为admin的数据,这就存储了admin用户的登录信息,该用户如果要再次访问/main的话就可以不用再输入用户名和密码了,但是这个存储时间有限,一般是两周。
五.消除持久化
就是加一个标签的事,在你main.html页面加一个(主要是href里的logout起作用)。
<a href="/logout">退出登陆</a>
然后启动项目:,点击退出项目,这时再到数据库刷新,查看数据时原来的admin信息被删除了,如果重新登录就得输入用户名和密码了。
六.Thymeleaf中Spring Security的使用,获得属性
根据源码得出下面属性:
name:登录账号名称
principal:登录主体,在自定义登录逻辑中是UserDetails
credentials:凭证(密码)
authorities:权限和角色
details:实际上是WebAuthenticationDetails的实例。可以获取remoteAddress(客户端ip)和sessionId(当前sessionId)
1.在pom.xml中添加依赖
如果maven加载完还爆红,那就试试把下面version标签的版本最后的3改小或者改答,比如改成3.0.4或者改成3.0.2试试。
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
<version>3.0.3.RELEASE</version>
</dependency>
2.创建show.html测试页面
在项目resources中新建templates文件夹,在templates中新建show.html页面,页面代码如下
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>获得springsecurity属性</h1>
登录账号:<span sec:authentication="name">123</span><br/>
登录账号:<span sec:authentication="principal.username">456</span><br/>
凭证:<span sec:authentication="credentials">456</span><br/>
权限和角色:<span sec:authentication="authorities">456</span><br/>
客户端地址:<span sec:authentication="details.remoteAddress">456</span><br/>
sessionId:<span sec:authentication="details.sessionId">456</span><br/>
通过权限判断:
<button sec:authorize="hasAuthority('/insert')">新增</button>
<button sec:authorize="hasAuthority('/delete')">删除</button>
<button sec:authorize="hasAuthority('/update')">修改</button>
<button sec:authorize="hasAuthority('/select')">查看</button>
<br/>
通过角色判断:
<button sec:authorize="hasRole('abc')">新增</button>
<button sec:authorize="hasRole('abc')">删除</button>
<button sec:authorize="hasRole('abc')">修改</button>
<button sec:authorize="hasRole('abc1')">查看</button>
</body>
</html>
3.对控制器进行编译
我们回到我们的控制层controller,
并在SecurityController这个类里添加以下的代码
@RequestMapping("/show")
public String show(){
return "show";
}
4.在业务类重新进行权限设置
我们又回到UserDetailsServiceImpl这个实现类
把里面的return new Uer...........注掉,然后写下面那个代码
return new User(username,password, AuthorityUtils.commaSeparatedStringToAuthorityList("admin,/select,/insert,ROLE_abc1"));
相当于获得这个admin用户的基本信息和权限信息,它能干啥,不能干啥。这个说明了admin只有查询和增加功能,然后这几个参数的顺序可以随便。
5.启动项目
登录
上面的地址栏改为show.然后跳转
七.我idea项目的项目结构
希望能帮到大家。