• Java-Shiro(二):HelloWord


    新建项目&&配置pom.xml导入包

    新建maven java project项目;

    修改pom.xml:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.dx.spring.shiro</groupId>
        <artifactId>shiro-02</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>Archetype - shiro-02</name>
        <url>http://maven.apache.org</url>
        <dependencies>
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-core</artifactId>
                <version>1.2.4</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.7.13</version>
            </dependency>
        </dependencies>
    </project>

    新建shiro.ini和log4j日志配置文件log4j.properties

    在项目的src/main/java下新建shiro.ini和log4j.properties文件

    shiro.ini和log4j.properties文件可以从

    拷贝,shiro.ini文件内容为:

    # -----------------------------------------------------------------------------
    # Users and their assigned roles
    # -----------------------------------------------------------------------------
    [users]
    # user 'root' with password 'secret' and the 'admin' role
    root = secret, admin
    # user 'guest' with the password 'guest' and the 'guest' role
    guest = guest, guest
    # user 'presidentskroob' with password '12345' ("That's the same combination on my luggage!!!" ;)), and role 'president'
    presidentskroob = 12345, president
    # user 'darkhelmet' with password 'ludicrousspeed' and roles 'darklord' and 'schwartz'
    darkhelmet = ludicrousspeed, darklord, schwartz
    # user 'lonestarr' with password 'vespa' and roles 'goodguy' and 'schwartz'
    lonestarr = vespa, goodguy, schwartz
    
    # -----------------------------------------------------------------------------
    # Roles with assigned permissions
    # -----------------------------------------------------------------------------
    [roles]
    # 'admin' role has all permissions, indicated by the wildcard '*'
    admin = *
    # The 'schwartz' role can do anything (*) with any lightsaber:
    schwartz = lightsaber:*
    # The 'goodguy' role is allowed to 'drive' (action) the winnebago (type) with license plate 'eagle5' (instance specific id)
    goodguy = winnebago:drive:eagle5

    修改log4j.properties

    log4j.rootLogger=INFO, stdout
    
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n
    
    # General Apache libraries
    log4j.logger.org.apache=INFO
    
    # Spring
    log4j.logger.org.springframework=INFO
    
    # Default Shiro logging
    log4j.logger.org.apache.shiro=INFO
    
    # Disable verbose logging
    log4j.logger.org.apache.shiro.util.ThreadContext=INFO
    log4j.logger.org.apache.shiro.cache.ehcache.EhCache=INFO

    新建com.dx.spring.shiro包,把

    下Quickstart.java拷贝到com.dx.spring.shiro包下:

    package com.dx.spring.shiro;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.*;
    import org.apache.shiro.config.IniSecurityManagerFactory;
    import org.apache.shiro.mgt.SecurityManager;
    import org.apache.shiro.session.Session;
    import org.apache.shiro.subject.Subject;
    import org.apache.shiro.util.Factory;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class Quickstart {
        private static final transient Logger log = LoggerFactory.getLogger(Quickstart.class);
    
        public static void main(String[] args) {
            // The easiest way to create a Shiro SecurityManager with configured
            // realms, users, roles and permissions is to use the simple INI config.
            // We'll do that by using a factory that can ingest a .ini file and
            // return a SecurityManager instance:
    
            // Use the shiro.ini file at the root of the classpath (file: and url:
            // prefixes load from files and urls respectively):
            Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
            SecurityManager securityManager = factory.getInstance();
    
            // for this simple example quickstart, make the SecurityManager
            // accessible as a JVM singleton.
            // Most applications wouldn't do this and instead rely on their
            // container configuration or web.xml for webapps.
            // That is outside the scope of this simple quickstart, so we'll just do
            // the bare minimum so you can continue to get a feel for things.
            SecurityUtils.setSecurityManager(securityManager);
    
            // 获取当前环境下的一个Subject操作对象
            // Now that a simple Shiro environment is set up, let's see what you can
            // do: get the currently executing user:
            Subject currentUser = SecurityUtils.getSubject();
    
            // 将一个对象存储到shiro的Session对象中,并验证是否有操作权限。
            // Do some stuff with a Session (no need for a web or EJB container!!!)
            Session session = currentUser.getSession();
            session.setAttribute("someKey", "aValue");
            String value = (String) session.getAttribute("someKey");
            if (value.equals("aValue")) {
                log.info("Retrieved the correct value! [" + value + "]");
            }
    
            // let's login the current user so we can check against roles and
            // permissions:
            if (!currentUser.isAuthenticated()) {
                UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
                token.setRememberMe(true);
                try {
                    currentUser.login(token);
                } catch (UnknownAccountException uae) {
                    log.info("There is no user with username of " + token.getPrincipal());
                } catch (IncorrectCredentialsException ice) {
                    log.info("Password for account " + token.getPrincipal() + " was incorrect!");
                } catch (LockedAccountException lae) {
                    log.info("The account for username " + token.getPrincipal() + " is locked.  "
                            + "Please contact your administrator to unlock it.");
                }
                // ... catch more exceptions here (maybe custom ones specific to
                // your application?
                catch (AuthenticationException ae) {
                    // unexpected condition? error?
                }
            }
    
            // say who they are:
            // print their identifying principal (in this case, a username):
            log.info("User [" + currentUser.getPrincipal() + "] logged in successfully.");
    
            // test a role:
            if (currentUser.hasRole("schwartz")) {
                log.info("May the Schwartz be with you!");
            } else {
                log.info("Hello, mere mortal.");
            }
    
            // test a typed permission (not instance-level)
            if (currentUser.isPermitted("lightsaber:weild")) {
                log.info("You may use a lightsaber ring.  Use it wisely.");
            } else {
                log.info("Sorry, lightsaber rings are for schwartz masters only.");
            }
    
            // 验证当前认证用户是否拥有某个具体操作:商品管理:删除:商品ID为5的记录
            // a (very powerful) Instance Level permission:
            if (currentUser.isPermitted("winnebago:drive:eagle5")) {
                log.info(
                        "You are permitted to 'drive' the winnebago with license plate (id) 'eagle5'.  Here are the keys - have fun!");
            } else {
                log.info("Sorry, you aren't allowed to drive the 'eagle5' winnebago!");
            }
    
            // all done - log out!
            currentUser.logout();
    
            System.exit(0);
        }
    }

    编译运行,打印信息如下:

    2018-06-13 19:54:00,673 INFO [org.apache.shiro.session.mgt.AbstractValidatingSessionManager] - Enabling session validation scheduler... 
    2018-06-13 19:54:01,441 INFO [com.dx.spring.shiro.Quickstart] - Retrieved the correct value! [aValue] 
    2018-06-13 19:54:01,443 INFO [com.dx.spring.shiro.Quickstart] - User [lonestarr] logged in successfully. 
    2018-06-13 19:54:01,444 INFO [com.dx.spring.shiro.Quickstart] - May the Schwartz be with you! 
    2018-06-13 19:54:01,445 INFO [com.dx.spring.shiro.Quickstart] - You may use a lightsaber ring.  Use it wisely. 
    2018-06-13 19:54:01,445 INFO [com.dx.spring.shiro.Quickstart] - You are permitted to 'drive' the winnebago with license plate (id) 'eagle5'.  Here are the keys - have fun! 
  • 相关阅读:
    支付宝接口相关整理
    诡异的 &quot;password取回&quot; 邮件问题
    剑指 offer代码解析——面试题39推断平衡二叉树
    女程序猿做了个梦,各路大神惊现神级评论!
    Mac: Android studio+VirtualBox+Genymotion
    lua 中pairs 和 ipairs差别
    機器學習基石 (Machine Learning Foundations) 作业1 Q15-17的C++实现
    怎样获取HTML5视频的持续时间
    Android之本地相冊图片选取和拍照以及图片剪辑
    19_Android中图片处理原理篇,关于人脸识别站点,图片载入到内存,图片缩放,图片翻转倒置,网上撕衣服游戏案例编写
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/9179684.html
Copyright © 2020-2023  润新知