shiro实现登录安全认证

Springboot 整合 Shiro 实现登录认证和权限校验 shiro介绍: Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。 三个核心组件:Subject, SecurityManager 和 Realms. Subject:即“当前操作用户”。但是,在Shiro中,Sub... 阅读详情

shiro实现登录安全认证

shiro的优势,不需要再代码里面判断是否登录,是否有执行的权限,实现了从前端页面到后台代码的权限的控制非常的灵活方便

传统的登录认证方式是,从前端页面获取到用户输入的账号和密码之后,直接去数据库查询账号和密码是否匹配和存在,如果匹配和存在就登录成功,没有就提示错误

而shiro的认证方式则是,从前端页面获取到用户输入的账号和密码之后,传入给一个UsernamePasswordToken对象也就是令牌,

然后再把令牌传给subject,subject会调用自定义的 realm,

realm做的事情就是用前端用户输入的用户名,去数据库查询出一条记录(只用用户名去查,查询拿到返回用户名和密码),然后再把两个密码进行对比,不一致就跑出异常

也就是说如果subject.login(token);没有抛出异常,就表示用户名和密码是匹配的,表示登录成功

1.在pom.xml中引入shiro依赖

    <!-- 引入shiro框架的依赖 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-all</artifactId>
            <version>1.2.2</version>
        </dependency>

2.在web.xml中配置过滤器

<!-- 配置spring提供的用于整合shiro框架的过滤器 -->
  <filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

3.在applicationContext.xml中配置DelegatingFilterProxy的Bean

<!-- 配置一个shiro框架的过滤器工厂bean,用于创建shiro框架的过滤器 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- 注入安全管理器对象 -->
        <property name="securityManager" ref="securityManager"/>
        <!-- 注入登录页面访问URL -->
        <property name="loginUrl" value="/login.jsp"/>
        <!-- 注入权限不足提供页面访问URL -->
        <property name="unauthorizedUrl" value="/unauthorized.jsp"/><!-- 已经登录,但是用户没有权限的时候才跳转 -->
        <!-- 配置URL拦截规则 -->
        <property name="filterChainDefinitions">
            <value>
                /css/** = anon
                /js/** = anon
                /images/** = anon
                /validatecode.jsp* = anon
                /login.jsp* = anon
                /userAction_login.action = anon
                /page_base_staff.action = perms["staff"]
                /** = authc<!-- 其他设置用户认证才能使用-->
            </value>
        </property>
    </bean>
    
    <!-- 注册安全管理器 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"></bean>

常用过滤器

常用过滤器:
anon:例子/admins/**=anon表示可以匿名访问
authc:例如/admins/user/**=authc表示需要认证才能使用,没有参数
perms:例子/page_base_staff.action = perms["staff"],当前用户需要有staff权限才可以访问。
roles:例子/admins/user/**=roles[admin],当前用户是否有这个角色权限。

登录方法的编写

传统的登录方法

    
    public String login(){
                //调用service层查询账号和密码是否一致
                UserBean user= userService.login(model);
                if(user!=null)
                {
                    return "index";
                }
                else
                {
                    addActionError("用户名和密码不匹配...");
                    return "login";
                }
                
            }
    }

shiro的登录认证方法

    public String login(){           
                if((!StringUtils.isBlank(checkcode))&&key.contentEquals(checkcode) )
                {
                    Subject subject = SecurityUtils.getSubject();//获取当前用户对象
                    //生成令牌(传入用户输入的账号和密码)
                    UsernamePasswordToken token=new UsernamePasswordToken(model.getUsername(),MD5Utils.md5(model.getPassword()));
                    
                    //认证登录
                    try {
                        //这里会加载自定义的realm
                subject.login(token);//把令牌放到login里面进行查询,如果查询账号和密码时候匹配,如果匹配就把user对象获取出来,失败就抛异常
                UserBean user= (UserBean) subject.getPrincipal();//获取登录成功的用户对象(以前是直接去service里面查)
                ServletActionContext.getRequest().getSession().setAttribute("user", user);
                        return "index";
                    } catch (Exception e) {
                        //认证登录失败抛出异常
                        addActionError("用户名和密码不匹配...");
                        return "login";
                    }
                }
        }
    
    
                    

自定义realm的编写

public class Bos_realm extends AuthorizingRealm {

    @Resource
    private IUserDao<UserBean> userDao;
    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        
    UsernamePasswordToken usertoken=(UsernamePasswordToken) token;//获取令牌(里面存放new UsernamePasswordToken放入的账号和密码)
      
        //得到账号和密码
        String username = usertoken.getUsername();
        
        UserBean findusername = userDao.findByusername(username);//去sql查询用户名是否存在,如果存在返回对象(账号和密码都有的对象)
      
        if(findusername!=null)//如果用户名存在
        {
            //参数1.用户认证的对象(subject.getPrincipal();返回的对象),
            //参数2.从数据库根据用户名查询到的用户的密码
            //参数3.把当前自定义的realm对象传给SimpleAuthenticationInfo,在配置文件需要注入
            AuthenticationInfo Info = new SimpleAuthenticationInfo(findusername, findusername.getPassword(),this.getName());
            return Info;
        
        }else
        {
            return null;
        }
    }

}

在安全管理器里面注入自定义的realm

    <!-- 注册安全管理器 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    <!-- 注入realm到安全管理器进行密码匹配 -->
    <property name="realm" ref="BosRealm"></property>
    </bean>
    <!-- 自定义的realm -->
    <bean id="BosRealm" class="com.itheima.bos.action.Bos_realm"></bean>

添加权限四方式

1_url

在里面添加拦截规则

<!-- 配置URL拦截规则 -->
        <property name="filterChainDefinitions">
            <value>
                /css/** = anon
                /js/** = anon
                /images/** = anon
                /validatecode.jsp* = anon
                /login.jsp* = anon
                /User_login.action= anon
                /page_base_staff.action = perms["staff"] <!-- 拦截page_base_staff.action这个方法必须有staff权限才能使用 -->
                /** = authc
            </value>
        </property>

2_注解

需要在中配置开启注解扫描才能使用

开启添加权限的注解扫描

    <bean id="defaultAdvisorAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
        <!-- 配置强制使用cglib方式为Action创建代理对象 -->
        <property name="proxyTargetClass" value="true"/>
    </bean>
    
    <!-- 配置shiro框架的切面类 -->
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"/>
//把订单设置为作废
    @RequiresPermissions("staff.delete")//为delete这个方法添加staff.delete权限
    public String delete()
    {
        //得到id
        staffService.deleteBatch(ids);
        return "staff";
    }

3_jsp页面

需要导入shiro标签库

<%@ taglib uri="http://shiro.apache.org/tags"  prefix="shiro"%>
    /* 有staff权限才能显示此按钮 */
<shiro:hasPermission name="staff1">
    {
        id : 'button-delete',
        text : '作废',
        iconCls : 'icon-cancel',
        handler : doDelete
    },
    </shiro:hasPermission>

4_代码(几乎不用)

在要设置权限的代码中添加一下两行代码就可以了

    //修改
    public String edit()
    {
        Subject subject = SecurityUtils.getSubject();
        subject.checkPermission("staff.edit");//要运行此方法下面的代码,必须要拥有staff.edit的权限
        //更新model
        staffService.update(model);
        return "staff";
    }

授权

手动授权和认证

因为要授权的权限太多,所以需要一张权限表

public class Bos_realm extends AuthorizingRealm {

    @Resource
    private IUserDao<UserBean> userDao;
    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {

      
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.addStringPermission("staff");//为page_base_staff.action请求授权staff权限
        info.addStringPermission("staff.delete");//为page_base_staff.action请求授权staff权限
        info.addStringPermission("staff.edit");
        return info;
     
    }

    //用户的登录认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //这里添加认证代码
      
      UsernamePasswordToken usertoken=(UsernamePasswordToken) token;//获取令牌(里面存放的有账号和密码)
        
        //查询用户名是否存在
        String username = usertoken.getUsername();
        
        UserBean findusername = userDao.findByusername(username);//去sql查询用户名是否存在
        if(findusername!=null)//如果用户名存在
        {
            //参数1.用户认证的对象(subject.getPrincipal();返回的对象),
            //参数2.从数据库根据用户名查询到的用户的密码
            //参数3.把当前自定义的realm对象传给SimpleAuthenticationInfo,在配置文件需要注入
            AuthenticationInfo Info = new SimpleAuthenticationInfo(findusername, findusername.getPassword(),this.getName());
            return Info;
        
        }else
        {
            return null;
        }
      

}

遍历数据库授权

获取当前登录的用户,去数据库查询当前用户的所有权限,然后添加

    SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();       

        //获取当前用户
        UserBean findusername = session.get......;
        
        //结果集
        List<AuthFunction> functionList =null;

        //去sql查询当前用户的权限
        if("admin".equals(findusername.getUsername()))//如果是管理员,获取所有权限
        {
             functionList = functionDao.findAll();
        }else
        {
            String hql = "SELECT DISTINCT f FROM AuthFunction f LEFT OUTER JOIN f.authRoles r LEFT              OUTER JOIN r.userBeans u WHERE u.id = ?";
            functionList = functionDao.findByHQL(hql,findusername.getId());
        }
        
        //遍历结果集授权
        for (AuthFunction authFunction : functionList) {
            info.addStringPermission(authFunction.getCode());
        }

        return info;
Springboot基础学习之(十七):通过Shiro实现用户得到登录认证和授权 springboot项目:通过shiro实现用户的认证和授权服务 设置网页的访问权限,不同的网页是具有不同的权限的用户才能够访问的 阅读详情

相关推荐

百元DIY手机荧光计:低成本荧光检测平台搭建与实战

荧光检测是一种基于物质受特定波长光激发后发射更长波长荧光的分析技术,其核心原理在于光与物质的相互作用。通过选择性激发与检测,该技术能实现对痕量物质的高灵敏度、高特异性定量分析,在生物医学、环境监测和食品安全等领域具有重要价值。传统荧光分光光度计虽精度高,但成本昂贵、体积庞大且操作复杂,限制了其在现场快检和普及教育中的应用。本文聚焦于如何利用智能手机的高性能摄像头和处理器,结合低成本光学滤光片和LED光源,构建一个便携、经济的DIY荧光检测平台。该方案通过简化光路设计,采用带通滤光片进行波长选择,并利用图像处

weixin_34194829的博客 308

Shiro登录的使用以及原理(一)

好久没写博客了,这段时间对最近项目做个总结,先从登入下手,话不多说直奔主题,Shiro的登录使用以及原理。 一、Shiro主要作用 shiro主要的作用就是实现用户登录(认证,授权,加密等),用户登录后的用户信息存储(缓存),用户登出等。 二、登录的使用 在使用登录的时候,最常见的一串代码就是获取Subject,然后对Token进行login(); // 得到subject然后对创建用户名/密码身份验证 Subject subject = SecurityUtils.ge...

大鹏的博客 3321

echarts实现3D地图——map3D

【代码】echarts实现3D地图——map3D。

xiaoququ的博客 7324

基于Shiro框架的登录功能

Apache Shiro是一个Java安全框架,它提供了一套易于使用的API,用于身份验证、授权、加密和会话管理等安全操作。Shiro框架的主要目标是提供易于使用的安全功能,同时保持灵活性和可扩展性。

程序员小火龙的知识分享 1307

WPF MVVM实战:构建可绑定的RichTextBox富文本编辑器

本文详细介绍了如何在WPF MVVM模式下构建可绑定的RichTextBox富文本编辑器,解决标准RichTextBox.Document属性不支持数据绑定的问题。通过创建自定义BindableRichTextBox控件,实现FlowDocument的绑定支持,并分享插入图片、文本格式控制等实战技巧,帮助开发者高效开发富文本编辑功能。

weixin_33717117的博客 307

CKAD-CN 考试知识点分享(2) CronJob

成功创建 CronJobppi,每 5 分钟执行一次计算任务;配置了和;设置,超时自动终止;确保 Pod 不重启;手动创建ppi-testJob 验证功能正常;所有任务要求均已满足。

轻的博客 333

Shiro实现登陆认证、授权

文章目录一、Shiro简历及组成二、Shiro过滤器&标签三、Shiro环境搭建1.添加shiro依赖2.配置web.xml3.创建自定义realm类:AuthRealm,继承AuthorizingRealm4.配置applicationContext-shiro.xml, Spring整合shiro四、Shiro登陆认证(一)认证实现1.修改LoginController,通过shiro实现登陆认证2.编写AuthRealm,实现登陆认证五、Shiro登陆认证(二)自定义凭证匹配器实现认证自定义凭

bingxuebojue的博客 1475

SAP_通用模块-MASS批量操作技巧

SAP_MM模块-MASS/MM17批量更新主数据详细教程

风沙的博客 2169

shiro实现登录安全认证(转)

shiro实现登录安全认证 shiro的优势,不需要再代码里面判断是否登录,是否有执行的权限,实现了从前端页面到后台代码的权限的控制非常的灵活方便 传统的登录认证方式是,从前端页面获取到用户输入的账号和密码之后,直接去数据库查询账号和密码是否匹配和存在,如果匹配和存在就登录成功,没有就提示错误 而shiro的认证方式则是,从前端页面获取到用户输入的账号和密码之后,传入给一个UsernamePass...

weixin_34342992的博客 116

Abaqus数据导出技巧:轻松处理大量XY数据

通过上述三种方法,我们可以解决Abaqus中大量XY数据导出的问题。无论是使用插件、编写Python脚本,还是利用Abaqus的内置报告功能,都可以帮助我们高效地处理数据。希望这篇博客能够帮助到你,提高你在Abaqus使用过程中的数据处理效率。

m0_62153576的博客 1917

〔重庆理工大学〕大学物理实验--变温霍耳效应及其参数测定

每个老师要求不同,实验报告内容和数据仅供参考。

Pretty Boy Fox的博客 3044

Shiro安全认证

为什么80%的码农都做不了架构师?>>> ...

weixin_33948416的博客 220

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

shiro登陆失败提示_springmvc集成shiro登录失败处理

packagecom.chunhui.webservice.modules.sys.security;importjava.io.Serializable;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavax.annotation.PostConstruct;importcom.chunhui.we...

weixin_39636609的博客 177

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Apache Shiro 示例

第一个Apache Shiro程序   如果你是初次接触Apache Shiro,该文章将指导你创建一个初级的非常简单的使用Apache Shiro进行安全认证的程序,同时我们将讨论Shiro的核心理念以帮助你熟悉Shiro的设计方式和API。   如果你确实不想按照该示例一步一步地编写代码,你可以从下面地址下载一个基本上完全相同的程序作为参考,选择下载位置:     在Apache S

YYZhQ的专栏 8395

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Springboot之Shiro配置

Shiro 安全认证 1.导入jar 这个包是shiro的核心包 org.apache.shiro shiro-spring 1.4.0 这个jar是页面设置有权限才显示的jar com.github.theborakompanioni thymeleaf-extras-shiro 2.0.0 2.配置类 import at.pollux.thymeleaf.shiro.dialect.S...

qq_41343166的博客 394

30分钟学会如何使用Shiro

转载自:https://www.cnblogs.com/learnhow/p/5694876.html 一、架构 要学习如何使用Shiro必须先从它的架构谈起,作为一款安全框架Shiro的设计相当精妙。Shiro的应用不依赖任何容器,它也可以在JavaSE下使用。但是最常用的环境还是JavaEE。下面以用户登录为例: (1)使用用户的登录信息创建令牌 UsernamePasswordToken ...

狂躁的辣条的博客 188

S2SM集成Shiro-登录验证

FormAuthenticationFilter.java a id="FormAuthenticationFilter.java" >FormAuthenticationFilter.javaa>

zhangfeng2124的专栏 571

Java程序员如何使用 Shiro 框架

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 12分钟。来自:www.cnblogs.com/learnhow/p/5694876.html一、架构要学习如何使...

良月柒 529

转自大神《30分钟学会如何使用Shiro》

本篇内容大多总结自张开涛的《跟我学Shiro》原文地址:http://jinnianshilongnian.iteye.com/blog/2018936 我并没有全部看完,只是选择了一部分对我来说急需在项目中使用的知识加以学习。并且对于大多数第一次接触Shiro的同学来说,掌握这些也应该足够了。 一、架构 要学习如何使用Shiro必须先从它的架构谈起,作为一款安全框架Shiro的设计相当精妙...

zhangxiaojun211的博客 171
上一篇: 简单实现Shiro单点登录(自定义Token令牌)
下一篇: 30分钟学会如何使用Shiro
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值