JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作
1 学习计划
1、演示权限demo
2、权限概述
n 认证
n 授权
3、常见的权限控制方式
n url拦截权限控制
n 方法注解权限控制
4、创建权限数据模型
n 权限表
n 角色表
n 用户表
n 角色权限关系表
n 用户角色关系表
5、apache shiro框架简介
n 官网和下载
n 框架核心功能
n 框架调用流程
6、基于shiro框架进行认证操作
2 演示权限demo

如何运行项目:
第一步:在eclipse中引入上面的项目

第二步:创建一个数据库privilegedemo,并执行项目中的sql脚本


第三步:启动项目,可以完成自动建表,为itcast_user表插入一条初始化数据

3 权限概述
认证:系统提供的用于识别用户身份的功能,通常登录功能就是认证功能-----让系统知道你是谁??
授权:系统授予用户可以访问哪些功能的许可(证书)----让系统知道你能做什么??
4 常见的权限控制方式
4.1 URL拦截权限控制
底层基于拦截器或者过滤器实现

4.2 方法注解权限控制
底层基于代理技术实现,为Action创建代理对象,由代理对象进行权限校验

5 创建权限数据模型
l 权限表
l 角色表
l 用户表
l 角色权限关系表
l 用户角色关系表
角色就是权限的集合,引入角色表,是为了方便授权

6 apache shiro框架简介
官网:shiro.apache.org

l 下载文件:

l shiro框架的核心功能:
认证
授权
会话管理
加密
l shiro框架认证流程

Application Code:应用程序代码,由开发人员负责开发的
Subject:框架提供的接口,代表当前用户对象
SecurityManager:框架提供的接口,代表安全管理器对象
Realm:可以开发人员编写,框架也提供一些,类似于DAO,用于访问权限数据

7 在BOS项目中应用shiro框架进行认证
第一步:引入shiro框架相关的jar
<!-- 引入shiro框架的依赖 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.2.2</version>
</dependency>
第二步:在web.xml中配置spring框架提供的用于整合shiro框架的过滤器(记得放在struct过滤器的上方)
<!-- 配置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>
启动tomcat服务器,抛出异常:spring工厂中不存在一个名称为“shiroFilter”的bean对象

第三步:在spring配置文件中配置bean,id为shiroFilter
<!-- 配置shiro过滤器工厂bean -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="loginUrl" value="/login.jsp"/>
<property name="successUrl" value="/index.jsp"/>
<property name="unauthorizedUrl" value="/unauthorized.jsp"/>
<property name="filterChainDefinitions">
<value>
/css/** = anon
/js/** = anon
/images/** = anon
/login.jsp* = anon
/validatecode.jsp* = anon
/userAction_login.action = anon
/page_base_staff.action = perms["staff"]
/* = authc
</value>
</property>
</bean>
/**的意思是所有文件夹及里面的子文件夹
/*是所有文件夹,不含子文件夹
/是web项目的根目录
一级和多级的区别
框架提供的过滤器:anon代表可以匿名访问....

第四步:配置安全管理器
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
</bean>
第五步:修改UserAction中的login方法,使用shiro提供的方式进行认证操作
public String login() {
        String key = (String) ServletActionContext.getRequest().getSession().getAttribute("key");
        if (StringUtils.isNotBlank(key) && checkcode.equals(key)) {
            // 验证码正确
            Subject subject = SecurityUtils.getSubject();
            //用户密码令牌
            AuthenticationToken token = new UsernamePasswordToken(model.getUsername(),MD5Utils.md5(model.getPassword()));
            try{
                subject.login(token);
                User u = (User) subject.getPrincipal();
                ServletActionContext.getRequest().getSession().setAttribute("User", u);
            }catch(Exception e){
                e.printStackTrace();
                return LOGIN;
            }
            return "home";
        } else {
            // 验证码错误
            this.addActionError("输入的验证码错误!");
            return LOGIN;
        }
    }
第六步:自定义realm,并注入给安全管理器
public class BOSRealm extends AuthorizingRealm{
    @Autowired
    private IUserDao userDao;
    //认证方法
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("realm中的认证方法执行了。。。。");
        UsernamePasswordToken mytoken = (UsernamePasswordToken)token;
        String username = mytoken.getUsername();
        //根据用户名查询数据库中的密码
        User user = userDao.findUserByUserName(username);
        if(user == null){
            //用户名不存在
            return null;
        }
        //如果能查询到,再由框架比对数据库中查询到的密码和页面提交的密码是否一致
        AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());
        return info;
    }
    //授权方法
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // TODO Auto-generated method stub
        return null;
    }
最后修改一下spring配置文件里面的securityManger,注入Realm:
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="bosRealm"/>
</bean> <bean id="bosRealm" class="com.xyp.bos.realm.BOSRealm"/>
JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作的更多相关文章
- JAVAEE——BOS物流项目11:在realm中授权、shiro的方法注解权限控制、shiro的标签权限控制、总结shiro的权限控制方式、权限管理
		
1 学习计划 1.在realm中进行授权 2.使用shiro的方法注解方式权限控制 n 在spring文件中配置开启shiro注解支持 n 在Action方法上使用注解 3.★使用shiro的标签进行 ...
 - JAVAEE——BOS物流项目13:Quartz概述、创建定时任务、使用JavaMail发送邮件、HighCharts概述、实现区域分区分布图
		
1 学习计划 1.Quartz概述 n Quartz介绍和下载 n 入门案例 n Quartz执行流程 n cron表达式 2.在BOS项目中使用Quartz创建定时任务 3.在BOS项目中使用Jav ...
 - JAVAEE——BOS物流项目01:学习计划、搭建环境、主页设计(jQuery EasyUI)
		
1 学习计划 1.项目概述 项目背景介绍 2.搭建项目开发环境 数据库环境 maven项目搭建 svn环境搭建 3.主页设计(jQuery EasyUI) layout页面布局 accordion折叠 ...
 - JAVAEE——BOS物流项目03:学习计划、messager、menubutton、登陆拦截器、信息校验和取派员添加功能
		
1 学习计划 1.jQuery easyUI messager使用方式 n alert方法 n confirm方法 n show方法 2.jQuery easyUI menubutton使用方式 3. ...
 - JAVAEE——BOS物流项目09:业务受理需求分析、创建表、实现自动分单、数据表格编辑功能使用方法和工作单快速录入
		
1 学习计划 1.业务受理需求分析 n 业务通知单 n 工单 n 工作单 2.创建业务受理环节的数据表 n 业务通知单 n 工单 n 工作单 3.实现业务受理自动分单 n 在CRM服务端扩展方法根据手 ...
 - JAVAEE——BOS物流项目05:OCUpload、POI、pinyin4J、重构分页代码、分区添加、combobox
		
1 学习计划 1.实现区域导入功能 n OCUpload一键上传插件使用 n 将文件上传到Action n POI简介 n 使用POI解析Excel文件 n 完成数据库操作 n 使用pinyin4J生 ...
 - JAVAEE——BOS物流项目07:WebService入门、apache CXF入门、基于CXF发布CRM服务
		
1 学习计划 1.WebService入门 n 什么是WebService n 调用网络上的WebService服务 n SOAP和WSDL概念 n 基于JDK1.7发布一个简单的WebService ...
 - JAVAEE——BOS物流项目08:配置代理对象远程调用crm服务、查看定区中包含的分区、查看定区关联的客户
		
1 学习计划 1.定区关联客户 n 完善CRM服务中的客户查询方法 n 在BOS项目中配置代理对象远程调用crm服务 n 调整定区关联客户页面 n 实现定区关联客户 2.查看定区中包含的分区 n 页面 ...
 - JAVAEE——BOS物流项目12:角色、用户管理,使用ehcache缓存,系统菜单根据登录人展示
		
1 学习计划 1.角色管理 n 添加角色功能 n 角色分页查询 2.用户管理 n 添加用户功能 n 用户分页查询 3.修改Realm中授权方法(查询数据库) 4.使用ehcache缓存权限数据 n 添 ...
 
随机推荐
- 源码解析Flask的配置文件
			
在flask里,我们常在主文件中定义某些配置,比如: app.debug = True app.secret_key = 'helloworld!!' 实际上,flask中默认可以进行可选的配置项有很 ...
 - Linq SelectMany 交叉连接
			
class Student1 { public int Score { get; set; } public Student1(int score) { this.Score = score; } } ...
 - 算法题丨Remove Element
			
描述 Given an array and a value, remove all instances of that value in-place and return the new length ...
 - 算法题丨Move Zeroes
			
描述 Given an array nums, write a function to move all 0's to the end of it while maintaining the rela ...
 - gradle入门(1-8)gradle 的依赖查看、依赖排除和指定版本(需要验证!)
			
一.依赖查看 gradle dependencies 在gradle dependencies输出会有如下几种标记: 1.版本 : 唯一的依赖. 2.版本():还存在该库其他版本的依赖或者间接依赖,并 ...
 - SpringCloud的注解:EnableEurekaClient vs EnableDiscoveryClient
			
What's the difference between EnableEurekaClient and EnableDiscoveryClient? In some applications, I ...
 - jscript定时器,一直用的东西,你真的明白吗?
			
JavaScript定时器 JavaScript是一种解释型语言(边编译边执行),Js解析顺序是从上到下,然后将编译后的任务丢到一个事件队列中,然后事件内的函数会从上到下开始执行 setInterva ...
 - sqlalchemy通过ssh连接远程mysql服务器
			
首先需要一个模块sshtunnel,如果没有直接pip install sshtunnel from sshtunnel import SSHTunnelForwarder from sqlalche ...
 - angular-单页面应用程序
			
我们都知道angularjs是单一页面应用程序,那什么是单一页面应用程序呢?单一页面应用程序到底有什么好处呢? 下面我们来看一下: 首先我觉得可以把页面的响应模式分成这样大概3个阶段: 1. 最传统的 ...
 - 编写CGI程序步骤
			
CGI common gateway interface 可以让一个客户端,从网页浏览器向服务器请求数据, 这是描述客户端和服务器程序之间传输数据的一种标准. CGI是运行在服务器上的程序,提供同客户 ...