发表于: 2019-11-09 22:18:15

1 997


一、今天完成的事

1.学习shiro

1.shiro的核心api
  • subject:用户主体(把操作交给SecurityManager)

  • SecurityManager:安全管理器(关联Realm)

  • Realm:Shiro连接数据的桥梁

2.springboot整合shiro
1.导入依赖
    <dependency>
       <groupId>org.apache.shiro</groupId>
       <artifactId>shiro-spring</artifactId>
       <version>1.3.2</version>
   </dependency>
2.编写自定义的Realm类
public class CustomRealm extends AuthorizingRealm {

   /**
    *  权限认证,即登录过后,每个身份不一定,对应的所能看的页面也不一样。
    * @param principalCollection
    * @return
    */
   @Override
   protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
       System.out.println("------执行授权逻辑----------");
       return null;
   }
   
   /**
    * 身份认证。即登录通过账号和密码验证登陆人的身份信息。
    * @param authenticationToken
    * @return
    * @throws AuthenticationException
    */
   @Override
   protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
       System.out.println("-------执行认证逻辑--------");
       return null;
   }
}
3.编写shiro配置类
@Configuration
public class ShiroConfig {

   /**
    * 一个过滤器,拦截url
    * @param securityManager
    * @return
    */
   @Bean(name = "shiroFilter")
   public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
       ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
       //必须set项
       shiroFilterFactoryBean.setSecurityManager(securityManager);
       //设置登录页面
       shiroFilterFactoryBean.setLoginUrl("/login");
       //设置登录成功跳转页面
       shiroFilterFactoryBean.setSuccessUrl("/home");
       //权限不足跳转的页面
       shiroFilterFactoryBean.setUnauthorizedUrl("/login");
   
       //拦截器,下面的属性就是配置不会被拦截的url
       Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
       // authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问,封装在DefaultWebSecurityManager中
       filterChainDefinitionMap.put("/home","anon");
       //这行代码必须放在所有权限设置的最后,不然会导致所有 url 都被拦截 剩余的都需要认证
       filterChainDefinitionMap.put("/student/backDesk", "authc");
       shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
       return shiroFilterFactoryBean;
   }
   
   @Bean
   public SecurityManager securityManager() {
     DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
     //关联Realm
     defaultWebSecurityManager.setRealm(customRealm());
      return defaultWebSecurityManager;
   }
   
   /**
    * 创建Realm以便调用
    * @return
    */
   @Bean
   public CustomRealm customRealm() {
       return new CustomRealm();
   }

}
4.shiro内置过滤器,可以实现权限相关的拦截器
  • 常用的过滤器:

    • anon:无需验证(登录)可以访问

    • authc:必须认证才可以访问

    • user:如果使用remeberMe的而功能可以直接访问

    • perms:该资源必须得到资源权限才可以访问

    • role:该资源必须得到角色权限才可以访问

5.实现拦截功能

要拦截的url是localhost:80/student/backDesk,未授权的转态下会跳转到login页面

首页能访问

输入之后跳转到

在自定义的Realm类中加入认证操作

@Override
   protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
       System.out.println("-------执行认证逻辑--------");
       String username = (String) authenticationToken.getPrincipal();
       if (!"javaboy".equals(username)) {
           throw new UnknownAccountException("账户不存在!");
       }
       return new SimpleAuthenticationInfo(username, "123", getName());

   }

认证成功能正常跳转到后台

二、遇到的问题

登录页面未成功跳转,验证成功后跳转页面失败。后面断网了没有demo成功

三、收获

四、明天的计划

修改当前bug,再看一下shiro的讲解,小课堂



返回列表 返回列表
评论

    分享到