springboot与shiro整合学习小笔记

657 阅读3分钟

1.@ResponseBody的用处

@RequestMapping("/hello")
@ResponseBody
public String hello(){
   System.out.println("UserController.hello()");
   return "ok";
}
/**
 * 测试thymeleaf
 */
@RequestMapping("/testThymeleaf")
public String testThymeleaf(Model model){
   //把数据存入model
   model.addAttribute("name", "黑马程序员");
   //返回test.html
   return "test";
}

@ResponseBody是把类对象转换为json,即登入/hello,则页面打印ok,登入/testThymeleaf,则登入test.html页面,html页面可以写在resources目录下

2.redirect:的作用

//3.执行登录方法
try {
   subject.login(token);
   
   //登录成功
   //跳转到test.html
   //redirect:   表示返回/testThymeleaf请求,否则是去到testThymeleaf.html页面
   return "redirect:/testThymeleaf";
} catch (UnknownAccountException e) {
   //e.printStackTrace();
   //登录失败:用户名不存在
   model.addAttribute("msg", "用户名不存在");
   return "login";
}catch (IncorrectCredentialsException e) {
   //e.printStackTrace();
   //登录失败:密码错误
   model.addAttribute("msg", "密码错误");
   return "login";
}

3.使用ShiroDialect使不一样的权限用户看到不一样的html页面

html中

<hr/>
<!--若想使用shiro的标签,则要在ShiroConfig中配置ShiroDialect,用于thymeleaf和shiro标签配合使用-->
<div shiro:hasPermission="user:add">
进入用户添加功能: <a href="add">用户添加</a><br/>
</div>
<div shiro:hasPermission="user:update">
进入用户更新功能: <a href="update">用户更新</a><br/>
</div>

ShiroConfig中

/**
    * 配置ShiroDialect,用于thymeleaf和shiro标签配合使用
    */
   @Bean
   public ShiroDialect getShiroDialect(){
      return new ShiroDialect();
   }
}

4.ShiroConfig过滤器相关

/**
 * 创建ShiroFilterFactoryBean
 */
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager){
   ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
   
   //设置安全管理器
   shiroFilterFactoryBean.setSecurityManager(securityManager);
   
   //添加Shiro内置过滤器
   /**
    * Shiro内置过滤器,可以实现权限相关的拦截器
    *    常用的过滤器:
    *       anon: 无需认证(登录)可以访问
    *       authc: 必须认证才可以访问
    *       user: 如果使用rememberMe的功能可以直接访问
    *       perms: 该资源必须得到资源权限才可以访问
    *       role: 该资源必须得到角色权限才可以访问
    */
   Map<String,String> filterMap = new LinkedHashMap<String,String>();
   /*filterMap.put("/add", "authc");
   filterMap.put("/update", "authc");*/
   
   filterMap.put("/testThymeleaf", "anon");
   //放行login.html页面
   filterMap.put("/login", "anon");
   
   //授权过滤器
   //注意:当前授权拦截后,shiro会自动跳转到未授权页面
   filterMap.put("/add", "perms[user:add]");
   filterMap.put("/update", "perms[user:update]");
   
   filterMap.put("/*", "authc");

   //修改调整的登录页面(未设置则是默认进入login.jsp)
   shiroFilterFactoryBean.setLoginUrl("/toLogin");
   //设置未授权提示页面
   shiroFilterFactoryBean.setUnauthorizedUrl("/noAuth");
   //过滤器map
   shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
   
   
   return shiroFilterFactoryBean;
}

5.自定义的Realm认证与授权逻辑

/**
 * 自定义Realm
 * @author lenovo
 *
 */
public class UserRealm extends AuthorizingRealm{

   /**
    * 执行授权逻辑
    */
   @Override
   protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
      System.out.println("执行授权逻辑");
      
      //给资源进行授权
      SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
      
      //添加资源的授权字符串
      //info.addStringPermission("user:add");
      
      //到数据库查询当前登录用户的授权字符串
      //获取当前登录用户
      Subject subject = SecurityUtils.getSubject();
      //Principal就是本页末尾的SimpleAuthenticationInfo的第一个形参
      User user = (User)subject.getPrincipal();
      User dbUser = userSerivce.findById(user.getId());
      
      info.addStringPermission(dbUser.getPerms());
      
      return info;
   }
   
   @Autowired
   private UserService userSerivce;

   /**
    * 执行认证逻辑
    */
   @Override
   protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {
      System.out.println("执行认证逻辑");
      
      //编写shiro判断逻辑,判断用户名和密码
      //1.判断用户名
      UsernamePasswordToken token = (UsernamePasswordToken)arg0;
      
      User user = userSerivce.findByName(token.getUsername());
      
      if(user==null){
         //用户名不存在
         return null;//shiro底层会抛出UnKnowAccountException
      }
      
      //2.判断密码
      return new SimpleAuthenticationInfo(user,user.getPassword(),"");
   }

}

6.@MapperScan的作用

写在Application启动类中

@SpringBootApplication
//@MapperScan为接口扫描,本来mybatis配置中要将mapper和service对应,才能识别mapper接口,现在不写配置文件了
@MapperScan("com.itheima.mapper")
public class Application {

   public static void main(String[] args) {
      SpringApplication.run(Application.class, args);
   }
}

7.mybatis.type-aliases-package

application.properties中

//扫描包,将类名作为别名
mybatis.type-aliases-package=com.itheima.domain

domain目录下就是实体类,将实体类的属性与数据库里的字段名对应