开发者学堂课程【Spring Security知识精讲与实战演示(一):Spring Security使用自定义认证页面】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/730/detail/13033
Spring Security 使用自定义认证页面
Spring Security 可否使用自己的认证页面来完成认证。想要使用自己的认证页面就需要在 Spring Security 的主配置文件中提供对应的配置。
接下来在文件中配置认证信息。
首先输入 Spring Security,如下图哪一个长得像认证信息。
Security:from-login,其他的网址没有 from-login。说明 Spring Security 内部默认 from 表单方式。使用这个标签。
标签中有很多的属性,login-page 是自己的页面;就用 login-page 来指定。Security:from-login login-page=“/login.jsp”这样就可以指定自己的 login,登录页面。
Login-processing-url 是来指定认证的处理器地址的。Login-processing-url=“/Login”认证必须经过处理器,需要指定一个处理器地址。但是需要注意处理器不是自己写的。之前登录的访问器地址是Login,只需要将这个 Login 地址配过来即可。
Default-target-url 是默认跳转的 URL 路径。
假如认证通过了,应该设置默认去哪个页面的地址。注意指的是默认,不会去原来需要去的地方。就是正在访问订单,发现没有登录,登录完之后需要继续去订单页面。默认指的是就在登录页面开始登陆,并不知道要去哪,这时候需要告诉文件去哪。此刻一般情况下去首页。
Default-target-url=“/index.jsp”
发现 index.不是首页,而是欢迎页面。但是看下图:在代码中只写了 pages/main.jsp,所以这是请求转发到 main.jsp。
既然有登录成功,就有认证失败的时候。
如果认证失败,authentication-failure-url 这是认证失败的地址。将这个配过来。
认证失败之后:authentication-failure-url=“/failer.jsp”直接到认证失败的页面即可。
到目前为止认证信息就配完了。
但是有些同学会有疑惑?认证有处理器,虽然没有点击 login,但是处理器需要接收认证的信息。Form 表单提交的认证信息,是from 表单的内部属性,应该与这里接收的属性名保持一致。
但是用自己设置的页面,不知道 login 的内部属性。下图是认证页面:
点击F12:
依次点开下图中的导航栏:
可以看到内部属性为 user name。密码的内部属性是 password。
这里就可以大胆的猜测后开就是依靠 user name 和 password 这两个参数运行的。那么在自定义页面的时候,只要写的和上图一致就可以了。
打开自定义页面 login.jsp。可以看到用户名为 user name,用户名为 password。与其保持一致。
但是这里可不可以不一致呢?
也是可以的。如下图中有 username-parameter=“”password-parameter=“”以上两个就指定属性名了。
自定义 login.jsp 可以随意写,但是写完之后需要在 spring-security 内指定一下。不指定就不识别。
保持一致之后,就无需重新指定了。所以认证的步骤就到此结束。
接下来配置退出登录信息。
如上图使用 security:logout,退出也需要有推出的 URL,选择logout-url=“/logout”前面标黄的 logout 也不是自己写的,是spring-security 提供的,直接拿过来使用即可。
Logout-success-url 意思是退出成功之后去哪,退出之后只能去login.jsp。现在的项目是公司的后台管理系统,后台的管理系统不登录是无法访问的。一旦退出就只能去登录页面。
以上就是退出登录的信息。
按理说退出登录配置完成之后就可以启动测试了。
首先需要来到我们自己指定的 login.jsp 页面,但是/**包括login.jsp。既然包括,那么访问 login.jsp 也需要一个 ROLE-USER角色。这时,如果不把 login.jsp 放行,过来找他的时候会被拦截,所以没有权限。没有权限会去 login.jsp。去了 login.jsp 发现也没有权限。那么启动之后会进入死循环。会出现一直找 login.jsp,但是一直没有权限。
因此需要将 login.jsp 放了。有两种方式:
1、放完资源依然能够经过后续的过滤器。
2、放完之后可以完全绕开 Spring Security 过滤器。什么都不使用了,与 Spring Security 无关。
希望后续依然经过过滤器还是不在与过滤器有关系?
Login 页面即便是匿名访问,哪怕是登录失败也要经过过滤器。因为登录失败之后要去失败的页面,这个操作是 Spring Security 做的。Spring Security 做的,又想不经过 Spring Security 的过滤器是不可能的。所以这时必须要求这个页面同意匿名访问。
现在配置让认证页面可以匿名访问。指的就是这个页面可以不登陆就访问。但是即便不登录,后续的过滤器也可以经过。
Security:intercept-url pattern,依然是login.jsp。因为是对它放行。Access=“permitALL()”/这就表示依然会经过后续所有的权限验证。
到此自定义的认证信息就配置完毕了。接下来就需要启动项目,看看效果了。启动之后看自定义的认证页面能否顺利的跳转。
发现启动之后跳转是正常的,但是页面样式出现了错误:
其实可以大胆的想象,页面是没有样式的。
上图标蓝的资源会自动向服务器发送请求,href、image、gs都可以向服务器发请求。但是只要是向服务器发请求,就会被/**拦住。这样就展示不出请求。所以需要将以上的静态资源统统释放。让他们不要来,之后来了后续的步骤就没有办法继续做了。
那么这些内容的释放和认证页面的释放有什么区别?
Login 有可能会失败,失败会去失败页面。但是静态资源不会失败,Spring Security 无需对静态资源做处理。也就是说静态资源无需再经过后续的过滤器了。这时就可以将他们彻底释放了。这就叫释放静态资源。注意 Spring MAC 也有静态资源,但是和这里的是不一样的。Spring MAC 的释放资源是不让前端控制器去拦截,但是这个释放资源是不让 intercept pattern 路径拦截。
如何释放静态资源?
Security:http
这里后面加上 pattern,加上/cass/**表示css下的所有文件以及子目录的文件所有的都拦截。拦截之后:Security=“none”意思是与Security没有关系了。
如图所示,需要加上 img、plugins.这样静态资源就都释放了。
重新启动。(最好关闭重新启动,不要刷新)看看静态资源释放之后的认证页面。(带有样式的认证页面)
下图才是自定义的认证页面。