IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> springboot:shiro登录拦截 -> 正文阅读

[PHP知识库]springboot:shiro登录拦截

shiro的三大对象

在这里插入图片描述

Subject:是指用户,即与application进行交互的第三方,不一定是人,也可能是另一个程序。每一个subject都要绑定一个subjectMannger。
SubjectMannger:SecurityManager是Shiro体系结构的核心,并充当一种“伞”对象,该对象协调其内部安全组件,这些安全组件一起形成对象图。但是,一旦为应用程序配置了SecurityManager及其内部对象图,通常就不理会它。
Realm:本质上是特定于安全性的DAO:它封装了数据源的连接详细信息,并根据需要使关联数据可用于Shiro。在配置Shiro时,可以配置多个,但至少要配置一个。

代码展示

首先我们需要配置一个属于shiro的配置类,里面创建shiro所必须的三大对象,这三个对象是相互依存的,即创建另一个对象需要用前一个作为参数。

@Configuration
public class ShiroConfig {
    @Bean(name="shiroFilter")
    ShiroFilterFactoryBean doFilter(SecurityManager securityManager){
            ShiroFilterFactoryBean shiroFactory = new ShiroFilterFactoryBean();
            shiroFactory.setSecurityManager(securityManager);
            //设置登录页和没有权限返回的页面
            shiroFactory.setLoginUrl("/login");
            shiroFactory.setUnauthorizedUrl("/bupei");
            shiroFactory.setSuccessUrl("/index");
            //创建一个小本本
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        //ket页面 value权限
        // <!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
        filterChainDefinitionMap.put("/login","anon");
        filterChainDefinitionMap.put("/toLogin","anon");
        filterChainDefinitionMap.put("/static/css/**","anon");
        filterChainDefinitionMap.put("/static/js/**","anon");
        filterChainDefinitionMap.put("/static/images/**","anon");
        filterChainDefinitionMap.put("/static/fonts/**","anon");
        //设置静态资源放行
        filterChainDefinitionMap.put("/index", "authc");
        filterChainDefinitionMap.put("/logout", "authc");
        //这行代码必须写在最后否则会导致所有url都被拦截
        filterChainDefinitionMap.put("/**", "authc");


        shiroFactory.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFactory;
    }
    @Bean(name = "securityManager")
    SecurityManager getSecurityManager(UserRealm userRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(userRealm);
        return securityManager;
    }
    @Bean(name = "userRealm")
    UserRealm userRealm(){
        return new UserRealm();
    }
}

然后需要自定义一个Realm继承AuthorizingRealm类注入上面的配置

public class UserRealm extends AuthorizingRealm {
    @Autowired
    UserMapper userService;
    @Override//权限
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        Subject subject = SecurityUtils.getSubject();
        User user = (User) subject.getPrincipal();
//        info.addStringPermission(user.getPerms());
        return info;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        User user = userService.selectAByName(token.getUsername());
        SecurityUtils.getSubject().getSession().setAttribute("ID",user);
        if(user==null){
            return null;
        }
        return new SimpleAuthenticationInfo(user,user.getPassword(),"");
    }
}

然后到这我以为一切都结束了结果登录之后每一个请求都被弹回登陆界面,且再次登陆之后无法进入我刚才的请求。
然后我重新编写了登录逻辑。用shiro的方法login()来登录

 @RequestMapping("/login")
    public String login(Model model, HttpSession session,String username,String password){
        Subject user = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);

        String page = "index";
        try {
            user.login(token);
            User login = userService.login(token.getUsername());
            model.addAttribute("articleList",articleService.queryArticlesByUserId(login.getId()));
            session.setAttribute("ID",login);
        } catch (UnknownAccountException e) {
            model.addAttribute("msg", "用户不存在");
            page = "login";
        } catch (IncorrectCredentialsException e) {
            model.addAttribute("msg", "密码错误");
            page = "login";
        }

        return page;


    }

然后世界都正常了。

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 07:45:54  更:2021-09-19 07:47:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:19:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码