zoukankan      html  css  js  c++  java
  • Apache Shiro入门实例

    Shiro是一个强大灵活的开源安全框架,提供身份验证、授权、会话管理、密码体系。

    1.先创建一个Maven项目

    2.配置pom

    <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/xsd/maven-4.0.0.xsd"
    > <modelVersion>4.0.0</modelVersion> <groupId>cn.edu.stu</groupId> <artifactId>shiro-test</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.4</version> </dependency> </dependencies> </project>

    3.在src/main/java下创建log4j.properties文件,配置logger

    log4j.rootLogger=info, ServerDailyRollingFile, stdout 
    log4j.appender.ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender 
    log4j.appender.ServerDailyRollingFile.DatePattern='.'yyyy-MM-dd 
    log4j.appender.ServerDailyRollingFile.File=C://logs/notify-subscription.log 
    log4j.appender.ServerDailyRollingFile.layout=org.apache.log4j.PatternLayout 
    log4j.appender.ServerDailyRollingFile.layout.ConversionPattern=%d - %m%n 
    log4j.appender.ServerDailyRollingFile.Append=true
    
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
    log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n

    4.在根目录下创建auth.ini文件

    [users]
    lonestarr = vespa

    5.示例代码

    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.IncorrectCredentialsException;
    import org.apache.shiro.authc.LockedAccountException;
    import org.apache.shiro.authc.UnknownAccountException;
    import org.apache.shiro.authc.UsernamePasswordToken;
    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 ShiroTest {
    
        private static Logger logger = LoggerFactory.getLogger(ShiroTest.class);
        
        public static void main(String[] args) {
            Factory<org.apache.shiro.mgt.SecurityManager> factory =
                   new IniSecurityManagerFactory("auth.ini"); SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); //obtain the currently executing user Subject user = SecurityUtils.getSubject(); //logger.info("User is authenticated: " + user.isAuthenticated()); /*The Session is a Shiro-specific instance that provides most of * what you're used to with regular HttpSessions but with some * extra goodies and one big difference: it does not require * an HTTP environment! */ Session session = user.getSession(); session.setAttribute("key", "value"); if(!user.isAuthenticated()) { UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa"); token.setRememberMe(true); try { user.login(token); //if no exception, that's it, we're done! } catch (UnknownAccountException uae) { //username wasn't in the system, show them an error message? } catch (IncorrectCredentialsException ice ) { //password didn't match, try again? } catch (LockedAccountException lae) { //account for that username is locked - can't login. Show them a message? } //... more types exceptions to check if you want ... catch (AuthenticationException ae) { //unexpected condition - error? } } //get user name logger.info( "User [" + user.getPrincipal() + "] logged in successfully." ); //if user have specific role or not if(user.hasRole("schwartz")) { logger.info("May the Schwartz be with you!"); } else { logger.info( "Hello, mere mortal."); } //we can perform an extremely powerful instance-level permission //check - the ability to see if the user has the ability to access //a specific instance of a type if (user.isPermitted("winnebago:drive:eagle5" ) ) { logger.info("You are permitted to 'drive' the 'winnebago' with license plate (id) 'eagle5'." + "Here are the keys - have fun!"); } else { logger.info("Sorry, you aren't allowed to drive the 'eagle5' winnebago!"); } // when the user is done using the application, they can log out user.logout(); } }

    6.运行结果

    2016-08-04 15:27:48 INFO [org.apache.shiro.session.mgt.AbstractValidatingSessionManager] Enabling session validation scheduler...
    2016-08-04 15:27:48 INFO [cn.edu.stu.shiro.ShiroTest] User [lonestarr] logged in successfully.
    2016-08-04 15:27:48 INFO [cn.edu.stu.shiro.ShiroTest] Hello, mere mortal.
    2016-08-04 15:27:48 INFO [cn.edu.stu.shiro.ShiroTest] Sorry, you aren't allowed to drive the 'eagle5' winnebago!
  • 相关阅读:
    程序员的健康问题
    比特币解密
    浅谈比特币
    一款能帮助程序员发现问题的软件
    微软为什么总招人黑?
    写了一个bug,最后却变成了feature,要不要修呢?
    不管你信不信,反正我信了
    Excel工作表密码保护的破解
    pip笔记(译)
    super
  • 原文地址:https://www.cnblogs.com/13jhzeng/p/5736960.html
Copyright © 2011-2022 走看看