之前有用 shiro,这里采用spring security做权限区分。不用的角色登陆展示不同的页面。包含记住账号密码的功能(这个登陆后关闭浏览器,下次打开浏览器还是处于登陆状态)

1.pom引入依赖

这里额外加的thymeleaf是为了方便写页面。而springsecurity5是因为我喜欢用springboot2.x版本,如果是springboot1.x版本的话是引入springsecurity4。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-security</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  8. </dependency>
  9. <dependency>
  10.   <groupId>org.thymeleaf.extras</groupId>
  11.   <artifactId>thymeleaf-extras-springsecurity5</artifactId>
  12. </dependency>

2.编写配置类

如果是采用springboot2.x版本的话,需要在WebSecurityConfig的认证规则额外加.passwordEncoder(new MyPasswordEncoder())的设置。

  1. MyPasswordEncoder是自己新建的

    1. public class MyPasswordEncoder implements PasswordEncoder {
    2. @Override
    3. public String encode(CharSequence charSequence) {
    4. return charSequence.toString();
    5. }
    6. @Override
    7. public boolean matches(CharSequence charSequence, String s) {
    8. return s.equals(charSequence.toString());
    9. }
    10. }
  2. WebSecurityConfig写法: ```java

@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  1. @Override
  2. protected void configure(HttpSecurity http) throws Exception {
  3. //定制请求的授权规则
  4. http
  5. .authorizeRequests()
  6. .antMatchers("/").permitAll()
  7. .antMatchers("/level1/**").hasRole("VIP1")
  8. .antMatchers("/level2/**").hasRole("VIP2")
  9. .antMatchers("/level3/**").hasRole("VIP3");
  10. //开启自动配置的登陆功能,效果,如果没有登陆,没有权限就会来到登陆页面
  11. http.formLogin().usernameParameter("user").passwordParameter("pwd")
  12. .loginPage("/userlogin");
  13. //1、/login来到登陆页
  14. //2、重定向到/login?error表示登陆失败
  15. //3、更多详细规定
  16. //4、默认post形式的 /login代表处理登陆
  17. //5、一但定制loginPage;那么 loginPage的post请求就是登陆
  18. //开启自动配置的注销功能。
  19. http.logout().logoutSuccessUrl("/");//注销成功以后来到首页
  20. //1、访问 /logout 表示用户注销,清空session
  21. //2、注销成功会返回 /login?logout 页面;
  22. //开启记住我功能
  23. http.rememberMe().rememberMeParameter("remeber");
  24. //登陆成功以后,将cookie发给浏览器保存,以后访问页面带上这个cookie,只要通过检查就可以免登录
  25. //点击注销会删除cookie
  26. }
  27. //定义认证规则
  28. @Override
  29. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  30. //super.configure(auth);
  31. auth.inMemoryAuthentication()
  32. .passwordEncoder(new MyPasswordEncoder())
  33. .withUser("zhangsan").password("123456").roles("VIP1","VIP2")
  34. .and()
  35. .withUser("lisi").password("123456").roles("VIP2","VIP3")
  36. .and()
  37. .withUser("wangwu").password("123456").roles("VIP1","VIP3");
  38. }

}

  1. <a name="cAzMq"></a>
  2. # 3.页面代码
  3. 1. 首页
  4. 1. sec标签有点类似jsp里的c标签;sec:authorize类似c:if
  5. ```html
  6. <html xmlns:th="http://www.thymeleaf.org"
  7. xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
  8. <!--没有登陆的时候-->
  9. <div sec:authorize="!isAuthenticated()">
  10. </div>
  11. <!--登陆后-->
  12. <div sec:authorize="isAuthenticated()">
  13. </div>
  14. <!--角色是vip1的时候-->
  15. <div sec:authorize="hasRole('VIP1')">
  16. </div>
  1. 登录页

    1. <form th:action="@{/userlogin}" method="post">
    2. 用户名:<input name="user"/><br>
    3. 密码:<input name="pwd"><br/>
    4. <input type="checkbox" name="remeber"> 记住我<br/>
    5. <input type="submit" value="登陆">
    6. </form>

    4.效果展示

  2. 首页游客

image.png

  1. 登陆页

这里设置成了自己的登录页,没用security默认登陆页
image.png

  1. 拥有VIP1和VIP2的zhangsan登陆

image.png

  1. 拥有VIP2和VIP3的lisi登陆

image.png

5.相关代码

链接:https://pan.baidu.com/s/1eVRwqs21GvpS8SreowoGaA
提取码:j39b