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"/>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM