SpringBoot整合Shiro 二:Shiro配置类


 

环境搭建见上篇:

 

Shiro配置类配置

shiro的配置主要集中在 ShiroFilterFactoryBean

   

  关于权限:

  anon:无需认证就可以访问

?  authc:必须认证了才能访问 ?

  user:必须用有了 记住我 功能才能用 ?

  perms:拥有对某个资源的权限才能访问 ?

  role:拥有某个角色权限才能访问

 

1、登录拦截

ShiroConfigShiroFilterFactoryBean

  给控制器添加2个 "必须认证了才能访问"

   也就是使用 authc

@Bean(name = "shiroFilterFactoryBean")
 public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager")DefaultWebSecurityManager defaultWebSecurityManager){
     ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
     bean.setSecurityManager(defaultWebSecurityManager);
 ?
     /*
      * anon:无需认证就可以访问
      * authc:必须认证了才能访问
      * user:必须用有了 记住我 功能才能用
      * perms:拥有对某个资源的权限才能访问
      * role:拥有某个角色权限才能访问
      */
     Map filterMap = new LinkedHashMap<>();
 ?
     filterMap.put("/user/add","authc");
     filterMap.put("/user/update","authc");
 ?
     bean.setFilterChainDefinitionMap(filterMap);
 ?
     return bean;
 }

访问测试

点击 addupdate

都出现这个404页面

 

2、添加登录页面

登录页面

login.html

DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Titletitle>
 head>
 <body>
 ?
 <h1>登录h1>
 <hr>
 ?
 <form action="">
     <p>用户名:<input type="text" name="username">p>
     <p>密码:<input type="text" name="password">p>
     <p><input type="submit">p>
 form>
 ?
 body>
 html>

对应controller

 @RequestMapping("/toLogin")
 public String toLogin(){
     return "login";
 }

shiro配置类

  1.add 与 update 跳转合并

    filterMap.put("/user/*","authc");

  2.添加一个登录跳转

    bean.setLoginUrl("/toLogin");

@Bean(name = "shiroFilterFactoryBean")
 public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager")DefaultWebSecurityManager defaultWebSecurityManager){
     ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
     bean.setSecurityManager(defaultWebSecurityManager);
 ?
     /*
      * anon:无需认证就可以访问
      * authc:必须认证了才能访问
      * user:必须用有了 记住我 功能才能用
      * perms:拥有对某个资源的权限才能访问
      * role:拥有某个角色权限才能访问
      */
     Map filterMap = new LinkedHashMap<>();
 ?
     filterMap.put("/user/*","authc");
 ?
     bean.setFilterChainDefinitionMap(filterMap);
 ?
     bean.setLoginUrl("/toLogin");
 ?
     return bean;
 }

 

测试

点击 addupdate

出现登录页面

 

3、认证

controller中

  1.获取当前的用户

     Subject subject = SecurityUtils.getSubject();

  2.封装用户的登录数据

     UsernamePasswordToken token = new UsernamePasswordToken(username, password);

  3.执行登录方法,如果没有异常说明OK

    subject.login(token);

  4.对应异常

    UnknownAccountException:用户名不存在

    IncorrectCredentialsException:密码错误

@RequestMapping("/login")
 public String login(String username, String password, Model model) {
 ?
     //获取当前的用户
     Subject subject = SecurityUtils.getSubject();
 ?
     //封装用户的登录数据
     UsernamePasswordToken token = new UsernamePasswordToken(username, password);
 ?
     try {
         subject.login(token); //执行登录方法,如果没有异常说明OK
         return "index";
     } catch (UnknownAccountException e) {   //用户名不存在
         model.addAttribute("msg", "用户名错误");
         return "login";
     } catch (IncorrectCredentialsException e) {   //密码错误
         model.addAttribute("msg", "密码错误");
         return "login";
     }
 ?
 }

认证具体任务

UserRealm 中 doGetAuthenticationInfo

先将数据写死测试

只需判断用户名,密码shiro判断

//认证
 @Override
 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
     System.out.println("执行了=>认证doGetAuthenticationInfo");
 ?
     //用户名+密码
     String name = "root";
     String password="123";
 ?
     UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
 ?
     if (!token.getUsername().equals(name)){
         return null;    //return null 会自动抛出异常
     }
 ?
     //密码认证,shiro做
     return new SimpleAuthenticationInfo("",password,"");
 }

login.html

DOCTYPE html>
 <html lang="en" xmlns:th="http://www.thymeleaf.org">
 <head>
     <meta charset="UTF-8">
     <title>Titletitle>
 head>
 <body>
 ?
 <h1>登录h1>
 <hr>
 ?
 <form th:action="@{/login}">
     <p>用户名:<input type="text" name="username">p>
     <p>密码:<input type="text" name="password">p>
     <p><input type="submit">p>
 form>
 ?
 <p th:text="${msg}" style="color: red">p>
 ?
 body>
 html>

 

测试

用户名错误

密码错误

都正确

访问add

访问update