SpringSecurity
放行首页和静态资源
/Security/src/main/java/com/atguigu/security/config/WebAppSecurityConfig.java中重写父类的configure(HttpSecurity security)方法
- 默认的:所有请求都需要认证
protected void configure(HttpSecurity security) throws Exception {
logger.debug("Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity).");
security
.authorizeRequests()
.anyRequest().authenticated() //所有请求都需要进行认证
.and()
.formLogin()
.and()
.httpBasic();
}
- 重新:设置需要放行的jsp和url
@Override
protected void configure(HttpSecurity security) throws Exception {
//super.configure(security); 注释掉将取消父类方法中的默认规则
security.authorizeRequests() //对请求进行授权
.antMatchers("/layui/**","/index.jsp") //使用ANT风格设置要授权的URL地址
.permitAll() //允许上面使用ANT风格设置的全部请求
.anyRequest() //其他未设置的全部请求
.authenticated(); //需要认证
}
效果:除了登录页面外,其他页面:
未授权请求跳转到登录页面
@Override
protected void configure(HttpSecurity security) throws Exception {
//super.configure(security); 注释掉将取消父类方法中的默认规则
security.authorizeRequests() //对请求进行授权
.antMatchers("/layui/**","/index.jsp") //使用ANT风格设置要授权的URL地址
.permitAll() //允许上面使用ANT风格设置的全部请求
.anyRequest() //其他未设置的全部请求
.authenticated() //需要认证
.and()
.formLogin() //设置未授权请求跳转到登录页面
.loginPage("/index.jsp") //指定登录页
.permitAll(); //为登录页设置所有人都可以访问
}
指定登录页前后SpringSecurity登录地址变化:
效果:无论进行任何请求,都会跳转到登录页面上
通过调用loginProcessingUrl()方法指定登录地址。
设置登录系统的账号、密码
页面设置
给index.jsp设置表单
<p>${SPRING_SECURITY_LAST_EXCEPTION.message}</p>
<form action="${pageContext.request.contextPath }/index.jsp" method="post">
<!-- 防止跨站请求伪造以及表单重复提交 -->
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
……
</form>
※提示:如果希望在指定登录页面地址后指定登录操作本身地址,可以调用loginProcessingUrl(“登录地址”).permitAll()方法。
注意:要取消页面的“假”提交
后端配置
1、设置登录成功后默认前往的页面: .defaultSuccessUrl("/main.html");
2、账号、密码的请求参数名:要么修改页面上的表单项的name属性值,要么修改配置。如果修改配置可以调用usernameParameter()和passwordParameter()方法
默认账号的请求参数名:username
默认密码的请求参数名:password
3、重新另外一个父类的方法,来设置登录系统的账号密码
@Override
protected void configure(AuthenticationManagerBuilder builder) throws Exception {
//super.configure(auth); 一定要禁用默认规则
builder.inMemoryAuthentication()
.withUser("tom").password("123123") //设置账号密码
.roles("ADMIN") //设置角色
.and()
.withUser("jerry").password("456456")//设置另一个账号密码
.authorities("SAVE","EDIT"); //设置权限
}
Cannot pass a null GrantedAuthority collection问题是由于没有设置roles()或authorities()方法导致的。
用户注销
理论
通过调用HttpSecurity对象的一系列方法设置注销功能。
- logout()方法:开启注销功能
- logoutUrl()方法:自定义注销功能的URL地址
如果CSRF功能没有禁用,那么退出请求必须是POST方式。如果禁用了CSRF功能则任何请求方式都可以。
- logoutSuccessUrl()方法:退出成功后前往的URL地址
- addLogoutHandler()方法:添加退出处理器
- logoutSuccessHandler()方法:退出成功处理器
前端
后端
基于角色进行访问控制
通过HttpSecurity对象设置资源的角色要求
蓝色代码设置范围更大
红色代码设置范围相对小
如果蓝色代码先调用,会把后面红色代码的设置覆盖,导致红色代码无效。所以要先做具体小范围设置,再做大范围模糊设置。
通过AuthenticationManagerBuilder对象设置用户登录时具备的角色
是什么权限,就只能访问相应资源,如果没有权限,就会看到403界面
自定义403错误页面
HttpSecurity对象.exceptionHandling().accessDeniedPage("/to/no/auth/page.html");
推荐阅读
-
SpringSecurity
-
SpringSecurity--记住我
-
SpringSecurity (1) Quickstart
-
spring-security(二十六)整合CAS 实现SSO 博客分类: spring security springsecurity
-
springboot面试之集成springsecurity
-
Springboot+SpringSecurity+JWT +Vue实现前后端分离的登录 权限管理以及token管理
-
SpringSecurity---实现图形验证码的AuthenticationProvider
-
【阿里小哥告诉我】SpringSecurity与自动登录,注销登录的爱恨情仇
-
SpringSecurity默认数据库模型的认证与授权Demo
-
SpringSecurity表单认证-自定义表单登录页面demo