• JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作


    1 学习计划

    1、演示权限demo

    2、权限概述

    n 认证

    n 授权

    3、常见的权限控制方式

    n url拦截权限控制

    n 方法注解权限控制

    4、创建权限数据模型

    n 权限表

    n 角色表

    n 用户表

    n 角色权限关系表

    n 用户角色关系表

    5apache shiro框架简介

    n 官网和下载

    n 框架核心功能

    n 框架调用流程

    6、基于shiro框架进行认证操作

    演示权限demo

     

    如何运行项目:

    第一步:在eclipse中引入上面的项目

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

     

     

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

     

    权限概述

    认证:系统提供的用于识别用户身份的功能,通常登录功能就是认证功能-----让系统知道你是谁??

    授权:系统授予用户可以访问哪些功能的许可(证书)----让系统知道你能做什么??

    常见的权限控制方式

    4.1 URL拦截权限控制

    底层基于拦截器或者过滤器实现

     

    4.2 方法注解权限控制

    底层基于代理技术实现,为Action创建代理对象,由代理对象进行权限校验

     

    创建权限数据模型

    l 权限表

    l 角色表

    l 用户表

    l 角色权限关系表

    l 用户角色关系表

    角色就是权限的集合,引入角色表,是为了方便授权

     

    apache shiro框架简介

    官网:shiro.apache.org

     

    l 下载文件:

     

    l shiro框架的核心功能:

    认证

    授权

    会话管理

    加密

    l shiro框架认证流程

     

    Application Code:应用程序代码,由开发人员负责开发的

    Subject:框架提供的接口,代表当前用户对象

    SecurityManager:框架提供的接口,代表安全管理器对象

    Realm:可以开发人员编写,框架也提供一些,类似于DAO,用于访问权限数据

     

    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配置文件中配置beanidshiroFilter

        <!-- 配置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"/>
  • 相关阅读:
    c#基础之Type
    .Net IOC框架入门之三 Autofac
    EF的三种数据加载方式
    EntityFramework扩展之第三方类库
    EF Codefirst入门之创建数据库
    EasyUI combotree的使用
    MacOS 安装 gdb 踩过的坑
    enex 转 md 格式的几种方式(免费版/氪金版)
    C++ 标准库之 iomanip 、操作符 ios::fixed 以及 setprecision 使用的惨痛教训经验总结
    python list 中 remove 的骚操作/易错点
  • 原文地址:https://www.cnblogs.com/xieyupeng/p/8940403.html
Copyright © 2020-2023  润新知