权限控制和注销

1、开启自动配置的注销的功能

1
2
3
4
5
6
7
//定制请求的授权规则
@Override
protected void configure(HttpSecurity http) throws Exception {
//开启自动配置的注销的功能
// 默认为/logout 注销请求
http.logout().deleteCookies("remove").invalidateHttpSession(true).logoutSuccessUrl("/");
}

2、我们在前端,增加一个注销的按钮,index.html 导航栏中

1
2
3
<div class="btn-group btn-group-lg">
<button type="button" class="btn btn-default"><a th:href="@{/logout}">注销</a></button>
</div>

3、我们可以去测试一下,登录成功后点击注销,发现注销完毕会跳转到登录页面!

4、但是,我们想让他注销成功后,依旧可以跳转到首页,该怎么处理呢?

1
2
// .logoutSuccessUrl("/"); 注销成功来到首页
http.logout().logoutSuccessUrl("/");

5、测试,注销完毕后,发现跳转到首页OK

6、我们现在又来一个需求:用户没有登录的时候,导航栏上只显示登录按钮,用户登录之后,导航栏可以显示登录的用户信息及注销按钮!还有就是,比如admin这个用户,它只有 vip2,vip3功能,那么登录则只显示这两个功能,而vip1的功能菜单不显示!这个就是真实的网站情况了!该如何做呢?

我们需要结合thymeleaf中的一些功能

sec:authorize="isAuthenticated()":是否认证登录!来显示不同的页面

Maven依赖:

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity4 -->
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
<version>3.0.4.RELEASE</version>
</dependency>

7、修改我们的 前端页面

导入命名空间

1
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"

修改导航栏,增加认证判断

重启测试,我们可以登录试试看,登录成功后确实,显示了我们想要的页面;

9、如果注销404了,就是因为它默认防止csrf跨站请求伪造,因为会产生安全问题,我们可以将请求改为post表单提交,或者在spring security中关闭csrf功能;我们试试:在 配置中增加 http.csrf().disable();

1
2
http.csrf().disable();//关闭csrf功能:跨站请求伪造,默认只能通过post方式提交logout请求
http.logout().deleteCookies("remove").invalidateHttpSession(true).logoutSuccessUrl("/");

10、我们继续将下面的角色功能块认证完成!