26.0、springboot-security注销以及权限控制、27.0、登录界面、网页“记住我”功能的实现

26.0、注销以及权限控制

        授权、认证、登录啥的在之前写的25.0文章里面

        开启注销功能,只需要在配置类中加上http.logout();即可,点击logout查看原码,可以看到源码中表示/logout请求可以执行注销功能,还可以附加上清除cookie的一些其他操作。

        点击logout查看原码,可以看到:

        http.logout().deleteCookies("remove").invalidateHttpSession(true);这个方法清除所有cookies(但是咱们一般不这么用,这里就不演示这个代码了)

        http.logout().logoutSuccessUrl("/index");方法设置一下注销后返回index主页

java配置类代码如下所示:

SecurityConfig 配置类文件

package com.hkl.config;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    //链式编程
    //授权
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //首页所有人可以访问,功能页只有对应有权限的人才能访问
        //请求授权的规则
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");

        //如果我们没有开启登录页面那么我们没有相应权限然后去访问的时候就会报错
        //开启登录页面
        http.formLogin();
        //注销,开启注销功能
        http.logout();
    }
    //认证,springboot2.1.x 可以直接使用~
    //密码加密编码处理:PasswordEncoder
    //在Spring Security 5.0+ 新增了很多的加密的方法~
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//        这些认证的数据正常情况下应该从数据库里读取,但是由于我这里测试没有连接数据库,所以直接将数据写死。
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("hkl").password(new BCryptPasswordEncoder().encode("123")).roles("vip1","vip2","vip3")
                .and()
                .withUser("root").password(new BCryptPasswordEncoder().encode("123")).roles("vip1","vip2")
                .and()
                .withUser("xiaolan").password(new BCryptPasswordEncoder().encode("123")).roles("vip1");

    }
}

        但是我们发现主页显示的内容有一个问题:我们登录的用户拥有什么权限就应该显示相对应的内容,没有权限的内容不显示,而不是像现在这样显示所有的内容。

        这时候我们可以用到Securty-Thymeleaf整合包来实现这个效果:

第一步:在pom.xml文件中引入相应的整合包



    org.thymeleaf.extras
    thymeleaf-extras-springsecurity5
    3.0.4.RELEASE

        在html文件中导入springboot-security的命名空间:

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

第二步:我们在index中让他,如果登录了就显示注销按钮和登录的用户名,未登录就显示登录按钮


用户名: 角色: 注销

        如上所示用sec:authorize="!isAuthenticated()"来判断是否登录,登录了就显示用户信息和注销按钮,未登录就显示登录按钮


        如上所述的代码可以实现根据每个用户的权限来显示不同的内容

        sec:authorize="hasRole('vip1')"表示拥有vip1权限的用户可以看到该div的内容,其他两个div和这个写法类似,把vip1改成vip2、vip3即可,index页面代码如下所示

下面是index的完整代码:




    
    Title



首页

用户名: 角色: 注销

27.0、记住我功能的开启以及login页面的自定义修改

        开启记住我功能只需要在配置类中加入:http.rememberMe();

实现原理其实就是一个cookie,他的默认有效期为两周时间

        我们再来将它默认的登录页面改为自己写的登录页面

在配置类中加入以下代码即可:

        http.formLogin().loginPage("/gotologin");

        这里注意:在我们登录的界面登录表单提交要以post方式提交,而且input用户名的name属性必须为username,密码input的name属性必须为password(这是因为源码中设置了默认值,不这么写就无法接收到参数,可以用usernameParamter()和passwordParamter()来修改默认值)。提交的action必须为/gotologin也就是和自己配置loginPage的url要一致,

        也可以用第二种方法:

        http.formLogin().loginPage("/gotologin").loginProcessingUrl("/login");

        这里loginPage表示默认登录的页面跳转的url,loginProcessingUrl表示登录提交的表单action必须要和这个login一致。

自己的登录界面如何开启记住我功能在下面的配置类代码里也写了。

配置类代码如下SecurityConfig.java:

package com.hkl.config;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    //链式编程
    //授权
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //首页所有人可以访问,功能页只有对应有权限的人才能访问
        //请求授权的规则
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");

        //如果我们没有开启登录页面那么我们没有相应权限然后去访问的时候就会报错
        //开启登录页面
        http.formLogin();
        //注销,开启注销功能,并设置注销后跳转至index页面
        http.logout().logoutSuccessUrl("/");
        //开启记住我功能
        http.rememberMe();
        //修改默认的登录页面
        http.formLogin().loginPage("/gotologin").loginProcessingUrl("/login");
        //开启自定义登录界面的记住我功能
        http.rememberMe().rememberMeParameter("remeber");
    }
    //认证,springboot2.1.x 可以直接使用~
    //密码加密编码处理:PasswordEncoder
    //在Spring Security 5.0+ 新增了很多的加密的方法~
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//        这些认证的数据正常情况下应该从数据库里读取,但是由于我这里测试没有连接数据库,所以直接将数据写死。
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("hkl").password(new BCryptPasswordEncoder().encode("123")).roles("vip1","vip2","vip3")
                .and()
                .withUser("root").password(new BCryptPasswordEncoder().encode("123")).roles("vip1","vip2")
                .and()
                .withUser("xiaolan").password(new BCryptPasswordEncoder().encode("123")).roles("vip1");
    }
}

Login页面代码如下:




    
    
    Title


登录





记住我


你可能感兴趣的:(springboot学习总结,spring,boot,java,spring)