开发者学堂课程【Spring Security知识精讲与实战演示(三):集中式整合之编写SpringSecurity配置类】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/732/detail/13061
集中式整合之编写SpringSecurity配置类
1. 目前已经将jsp页面导入到当前项目中了,但是jsp页面是不能
够被springsecurity所识别的,要想被识别,就要通过配置的方式告诉它。
以前的配置方式是在配置文件中去写,但是springboot一般情况下是把重要的一些特殊的app配置在配置文件中,其余的都是以配置类的方式去配置,所以这里需要编写一个配置类。
2. 在com.itheima的基础之上建立一个子包
config.securityconfig,首先加一个注解configuration来指定当前这个类是配置类,这个相当于是一个入口是必须要加的,如果不加的话,组件扫描是不能识别当前这个类的。
在这里配置的都是springsecurity相关的注解和相关的配置,要想实现配置,就要添加enablewebsecurity注解,必须要加这个注解才能实现springsecurity的配置。
加了这个注解之后,看一下注解的详细内容,里面提到,只要加了这个注解,当前这个类需要实现一个接口或者继承一个类,一般情况下会选择继承一个类。继承了这个类之后,就有了springsecurity的所有默认配置。里面可以不写东西,如果里面不写东西,配置类也在起作用。
如果要写就要修改配置,要修改配置就要重写配置方法,首先要说明认证用户的来源,可以是内存或数据库,这里先定义内存。
3. 接下来要配置springsecurity的配置信息,类似于提供的专门的
springsecurity的配置文件。
这里需要用到两个方法,第一个是protect viod,将其改为public void,第二个同名但是内容不同(HttpSecurity http),同样也改为public。
第一个用auth,可以根据其中文意思判断其功能,选择使用内存,在内存中使用的话可以写withuser,里面备注用户名。
下面写password,里面备注123,需要注意的是:如果直接写123,springsecurity会认为它是一个密文,但这里123是个原文,只需在123前面加一个{noop}就可以使springsecurity知道123是个原文了。
继续写roles,用户必须有角色,没有角色的用户是没有意义的,springsecurity全凭这个角色进行授权认证,这里命名为USER,如果在配置类中指定角色的话,不要加前缀,否则就会报错。上述工作指定了认证用户的来源,这里先不连接数据库。
4. 配置springsecurity的相关信息时,首先需要释放静态资源,还
要指定资源拦截规则(访问哪些资源需要哪些角色需要说明),还需指定自定义认证页面,指定退出认证配置,csrf配置,顺着这个顺序写程序。
(1) 释放静态资源。首先全部都以http.authorizeRequests作为
开始,接下来有一个anMatchers指定路径,先来释放静态资源,里面可以写多个,释放login.jsp可以匿名访问,释放failer.jsp,释放css,还有img,plugins,到此,所有需要释放的资源即不需要让springsecurity拦截的资源,列出来之后再写一个permitALL。
(2) 指定路径拦截资源,同样也是anMatchers,在这里边写上一
个路径如/**,这是指所有的资源都需要一个角色,可以选择hasAnyRole或者hasRole,一个是多个角色一个是一个角色;也可以用ac,写spring的表达式,但是这样写没有直接写hasrole简便。这里选择hasAnyRole,里面写USER,ADMIN,其他的资源可以写为anyResquest,要求它必须认证才能访问,写为authenticated,表示其它资源只有认证之后才能访问。
(3) 指定自定义配置页面,加一个and表示新的开始,里面写
formlogin,配置和以前类似,需要指定一个loginpage,验证页面是login.jsp。指定log的url地址,这个地址就是login,不需要做任何改动,是springsecurity提供好的。
接下来再指定一个success,成功之后使其来到index.jsp;万一失败的话就来到failer.jsp。最后再写一个peimitALL,将上面的所有资源都释放了。
(4) 接下来做指定推出认证的配置,同样写一个and表示一个新
的开始。
写一个logout,先写一个logoutUrl,再写一个logoutSuccessUrl,说明输出成功之后去哪,成功之后就跳转到login.jsp。接下俩要说明是否提供session,里面写true,与之前一样,也要加一个permitAll,否则logout会被拦截。
(5) 继续进行csrf的配置,依旧写一个and,直接结束也可以,
但是如果不写这个,所有请求都必须携带springsecurity内部生成的随机topic。
为了测试方便,这里将csrf的资源释放掉,与之前一样,不让它起作用就可以,使用disable语句。如果这部分不加的话测试的时候就要加随机topic。
完整程序:
package com itheimm.config;
import org. springframework.context.annotation.
Configuration;
import org. springframework.security. config.
annotation.web.configuration. EnableWebSecurity;
import org.springframework.security.config.annotation web.configuration.WebSecurityConfigurerAdapter;
@
Configuration
@
EnableWebSecurity
public class SecurityConfig extends WebSecurity
ConfigurerAdapter {
//认证用户的来源【内存或数据库】
public void configure(AuthenticationManagerBuilder auth) throws Exception{
auth. inMemoryAuthentication()
.withUser( username: "user”)
.password(“{noop}123”)
.roles("USER”);
//配置 springSecurity 相关信息
public void configure(HttpSecurity http) throws Exception{
//释放静态资源,指定资源拦截规则,指定自定义认证页面,指定退出认证配置,csrf 配置
http.authorizeRequests() ExpressionlnterceptUrlRegistry
.antMatchers( …antPatterns:"/login.jsp", "/failer.jsp", "/css/**”,”img/**”,”/plugins/**").permitA11()
.antMatchers( ..antPatterns:"/**").hasAnyRole( ..roles:“USER","ADMIT”)
.anyRequest
.authenticated()
.and()
.formLogin()
. loginPage("/login. jsp”)
.loginProcessingUrl("/login"
.successForwardUrl("/index.jsp")
.failureForwardUrl("/failer.jsp")
.permitAll()
.and()
.logout ()
.logoutUrl("/logout")
.logoutSuccessUrl("/login. jsp")
.invalidateHttpSession(true)
.permitAll()
.and ()
.
csrf()
.
disable()
}}