SpringBoot整合Shiro 二:Shiro配置类

摘要:
请参阅环境构建的第一部分:SpringBoot集成Shiro 1:构建环境Shiro配置类配置Shiro配置主要集中在ShiroFilterFactoryBean中关于权限:anon:您可以访问authc而无需身份验证:您只能在身份验证后访问user:您可以使用remember me来使用perms:只有在您拥有角色的权限:只有在拥有角色1的权限后才能访问角色登录并在ShiroConfig中阻止ShiroF

 

环境搭建见上篇:SpringBoot整合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<String ,String> filterMap = new LinkedHashMap<>();
 ​
     filterMap.put("/user/add","authc");
     filterMap.put("/user/update","authc");
 ​
     bean.setFilterChainDefinitionMap(filterMap);
 ​
     return bean;
 }

访问测试

点击 addupdate

SpringBoot整合Shiro 二:Shiro配置类第1张

都出现这个404页面

 

2、添加登录页面

登录页面

login.html

<!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <title>Title</title>
 </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<String ,String> filterMap = new LinkedHashMap<>();
 ​
     filterMap.put("/user/*","authc");
 ​
     bean.setFilterChainDefinitionMap(filterMap);
 ​
     bean.setLoginUrl("/toLogin");
 ​
     return bean;
 }

 

测试

点击 addupdate

SpringBoot整合Shiro 二:Shiro配置类第2张

出现登录页面

 

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>Title</title>
 </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>

 

测试

用户名错误

SpringBoot整合Shiro 二:Shiro配置类第3张

密码错误

SpringBoot整合Shiro 二:Shiro配置类第4张

都正确

SpringBoot整合Shiro 二:Shiro配置类第5张

访问add

SpringBoot整合Shiro 二:Shiro配置类第6张

访问update

SpringBoot整合Shiro 二:Shiro配置类第7张

 

免责声明:文章转载自《SpringBoot整合Shiro 二:Shiro配置类》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[unity菜鸟] controller.SimpleMove(transform .forward); 无法移动webkit之滚动条美化下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Dubbo学习笔记12:使用Dubbo中需要注意的一些事情

指定方法异步调用 前面我们讲解了通过设置ReferenceConfig的setAsync()方法来让整个接口里的所有方法变为异步调用,那么如何指定某些方法为异步调用呢?下面讲解下如何正确地设置默写方法为异步调用。 假如你只需要设置接口里的方法sayHello为异步调用,那么可以使用下面方式: final List<MethodConfig> a...

AES对称加密和解密(转)

AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAl...

浅谈Spring中JDK动态代理与CGLIB动态代理

前言Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程)。在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式,AOP思想的实现则是基于代理模式。 代理模式:代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的索引,实际执行时通过调用代理类的方法、实际执...

LeetCode(71):简化路径

Medium! 题目描述: 给定一个文档 (Unix-style) 的完全路径,请进行路径简化。 例如,path="/home/", =>"/home"path="/a/./b/../../c/", =>"/c" 边界情况: 你是否考虑了 路径 ="/../"的情况?在这种情况下,你需返回"/"。 此外,路径中也可能包含多个斜杠'/',如"/...

[Swift]Scanner字符串扫描类

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址:https://github.com/strengthen/LeetCode➤原文地址:https://w...

C#修改SVG图片显示大小

private void Main() { if (File.Exists(_svgFile)) { SetSvgSize(_svgFile, spnWidth.Value, spnHeight.Value); }...