初识spring security
概念
Spring Security是spring采用AOP思想,基于servlet过滤器实现的安全框架。它提供了完善的认证机制和方法级的授权功能。是一款非常优秀的权限管理框架。
案例
- 新建项目
- 添加测试接口
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
-
启动项目
-
使用配置文件修改用户名密码
spring.security.user.name=admin
spring.security.user.password=123
- 使用代码配置用户名密码
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("javaboy.org")
.password("123").roles("admin");
}
}
①首先我们自定义 SecurityConfig 继承自 WebSecurityConfigurerAdapter,重写里边的 configure 方法。
②首先我们提供了一个 PasswordEncoder 的实例,因为目前的案例还比较简单,因此我暂时先不给密码进行加密,所以返回 NoOpPasswordEncoder 的实例即可。
③configure 方法中,我们通过 inMemoryAuthentication 来开启在内存中定义用户,withUser 中是用户名,password 中则是用户密码,roles 中是用户角色。
④如果需要配置多个用户,用 and 相连。
and相当于结束一层配置,开启新的配置
- 自定义登录页面
//创建一个SecurityConfig 类,重写它的 configure(WebSecurity web) 和 configure(HttpSecurity http) 方法
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
/**
* 代码配置用户名和密码
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("javaboy.org")
.password("123").roles("admin");
}
/**
* 忽略js、css这些信息,不在检查权限
*/
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/js/**", "/css/**","/images/**");
}
/**
* 配置登录页面
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
//配置了loginPage代表着登录页面和接口都是,除非自己定义
.loginPage("/login.html")
//自己配置登录接口
.loginProcessingUrl("/doLogin")
//定制参数名称,不用系统的username和password,同时前端页面也需要改成相对应的参数名
.usernameParameter("user")
.passwordParameter("pass")
//登录回调--登录成功后跳转这里是前后端不分离
//服务端跳转
//登录成功后,跳转index接口,无论从哪里跳转到登录都会到这个接口,并不会记录登录之前接口位置
.successForwardUrl("/index")
//重定向--页面地址会改变成对应接口地址,使用起来与上边二选一
.defaultSuccessUrl("/index")
//登录失败
//服务端跳转
.failureForwardUrl()
//重定向
.failureUrl()
.permitAll()
.and()
.logout()
//默认注销的 URL 是 /logout,是一个 GET 请求,我们可以通过 logoutUrl 方法来修改默认的注销 URL。
//.logoutUrl("/logout")
//logoutRequestMatcher 方法不仅可以修改注销 URL,还可以修改请求方式,实际项目中,这个方法和 logoutUrl 任意设置一个即可。
.logoutRequestMatcher(new AntPathRequestMatcher("/logout","POST"))
//logoutSuccessUrl 表示注销成功后要跳转的页面。
.logoutSuccessUrl("/login?logout")
//deleteCookies 用来清除 cookie。
.deleteCookies()
//clearAuthentication 和 invalidateHttpSession 分别表示清除认证信息和使 HttpSession 失效,默认可以不用配置,默认就会清除。
.clearAuthentication(true)
.invalidateHttpSession(true)
.permitAll()
.and()
.csrf().disable();
}
}
1、web.ignoring() 用来配置忽略掉的 URL 地址,一般对于静态文件,我们可以采用此操作。
2、如果我们使用 XML 来配置 Spring Security ,里边会有一个重要的标签 <http>,HttpSecurity 提供的配置方法 都对应了该标签。
authorizeRequests 对应了 <intercept-url>。
3、formLogin 对应了 <formlogin>。
4、and 方法表示结束当前标签,上下文回到HttpSecurity,开启新一轮的配置。
5、permitAll 表示登录相关的页面/接口不要被拦截。
6、最后记得关闭 csrf ,如果不关会导致页面出问题。
当我们定义了登录页面为 /login.html 的时候,Spring Security 也会帮我们自动注册一个 /login.html 的接口,这个接口是 POST 请求,用来处理登录逻辑。
登录成功回调:
defaultSuccessUrl 有一个重载的方法,我们先说一个参数的 defaultSuccessUrl 方法。如果我们在 defaultSuccessUrl 中指定登录成功的跳转页面为 /index,此时分两种情况,如果你是直接在浏览器中输入的登录地址,登录成功后,就直接跳转到 /index,如果你是在浏览器中输入了其他地址,例如 http://localhost:8080/hello,结果因为没有登录,又重定向到登录页面,此时登录成功后,就不会来到 /index ,而是来到 /hello 页面。
defaultSuccessUrl 还有一个重载的方法,第二个参数如果不设置默认为 false,也就是我们上面的的情况,如果手动设置第二个参数为 true,则 defaultSuccessUrl 的效果和 successForwardUrl 一致。
successForwardUrl 表示不管你是从哪里来的,登录后一律跳转到 successForwardUrl 指定的地址。例如 successForwardUrl 指定的地址为 /index ,你在浏览器地址栏输入 http://localhost:8080/hello,结果因为没有登录,重定向到登录页面,当你登录成功之后,就会服务端跳转到 /index 页面;或者你直接就在浏览器输入了登录页面地址,登录成功后也是来到 /index。
- 拷贝前端代码