想用 Spring Boot 做一个博客,一个登录功能就把我安排得明明白白。
发现别人的登录功能是用 Spring Security 实现的,但是我并没有找到合适的教程。一会儿跟着视频写,一会儿照着别人的文章敲,折腾了半天,虽说实现了登录和退出,但总感觉自己是在闭门造车。
实现的功能
- 首次访问提示未登录
- 登录之后显示用户身份(用户的身份包括:USER、ADMIN)
- 另外如果没有登录的话,是不能进入后台管理页面(/admin)的
具体实现
新建项目
- 工具:
- JDK1.8
- IDEA
添加依赖
- 第一个依赖是每个项目都需要的,就不多说了,多了我也不会。
- 第二、三个依赖是关于 Spring Security 的,下面是这两个包的官方说明。
Web - spring-security-web.jar
Contains filters and related web-security infrastructure code. Anything with a servlet API dependency. You’ll need it if you require Spring Security web authentication services and URL-based access-control. The main package is
org.springframework.security.web
.Config - spring-security-config.jar
Contains the security namespace parsing code & Java configuration code. You need it if you are using the Spring Security XML namespace for configuration or Spring Security’s Java Configuration support. The main package is
org.springframework.security.config
. None of the classes are intended for direct use in an application.
- 第四个依赖我也不了解,但是如果不加这个依赖那么就不能在 HTML 根据登录状态显示指定的内容。(下面会讲如何显示指定内容的)
- 最后一个依赖的功能是向浏览器返回一个 HTML 页面。当然了,它还有其他功能,我还没用到而已。
1 | <dependency> |
修改配置
修改端口以及 thymeleaf 相关配置。
1 | server.port=80 |
新建配置类
- 新建一个 config 文件夹,然后新建一个类。
- 这个类继承 WebSecurityConfigurerAdapter 类,并覆盖它的两个方法,方法的作用已经写有注释了。
注意点
- 理解一下代码的含义,比如哪些是需要登录才能访问的接口。
- 根据下面的代码,当需要访问权限时,会自动跳转到 127.0.0.1/login 路径下,所以在 Controller 中需要添加 login 接口,使其跳转到登录页面。
- 登录界面提交的路径同样是 127.0.0.1/login,也就是说登录表单的 action 值为 /login。
- 登录请求提交之后,Spring Security 会自动为我们处理,如果登录成功返回上一级页面,如果失败跳转到自定义的错误页面。(这里还有个需要注意的点,后面讲 login.html 的时候会讲。)
1 | import org.springframework.beans.factory.annotation.Autowired; |
新建 Controller 类
定义 admin、login 和 login-error 接口。
由于上面的配置类,所以未登录的情况下可以访问 / 接口,但是不能访问 /admin。
1 | import org.springframework.stereotype.Controller; |
新建 html 页面
先理一下思路:
- 进来先访问首页
- 点击登录或者访问后台管理页面将跳转到登录界面
- 已经在配置类中添加了用户信息,所以 Spring Security 将会为我们处理登录请求
- 登录成功,跳转回上一页
- 失败则跳转到失败页面
所以我们需要新建四个页面。
首页
注意点
1 | xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4" |
- 上面这一句定义了一个命名空间,由此可以获取到用户的相关信息,比如是否登录。更具体的用法可以去谷歌搜索。
- 注意下面 form 表单的 action 的写法,一定要这样写,不然就会出错。
templates 目录下的 index.html 代码:
1 |
|
后台管理页面
这个文件就没什么需要注意的了。
在 templates 目录下新建一个 admin 目录,再新建一个 index.html 文件:
1 |
|
登录失败页面
这个文件也没什么需要注意的。
1 |
|
登录界面
这个文件有一点非常需要注意,就是 action 那里,本以为两种写法没有什么区别,但是就是因为这里导致我花了很多时间。
1 |
|
很多东西只是会用一点点,却不知道它真正的用途是什么,也不知道还有那些用法,我还需要很长时间的学习。
总说网上学习资源多,但是有时候我真找不到我想要的,不知道是我找不到还是真的就没有。