zoukankan      html  css  js  c++  java
  • shiro权限配置的细节问题&认证

    细节:

    ---[urls]部分配置,其格式是    url=拦截器【参数】 ,拦截器【参数】
    ---如果当前请求的 url 匹配 【urls】 部分或者某个url模式,将会执行配置的拦截器
    ---anon(anonymous)拦截器表示匿名访问(即不需要登陆验证)
    ---authc(authentication)拦截器的表示需要身份认证之后才能访问
    <property name="filterChainDefinitions">
                <value>
                    /login.jsp = anon
                    # everything else requires authentication:
                    /** = authc
                </value>
            </property>

                   /login.jsp = anon
                    # everything else requires authentication:
                    /** = authc
                    /user.jsp = anon

     此时上面的会覆盖下面的user.jsp 无法访问

     认证:

    步骤:
    1.获取当前subject,SecurityUtils.getSubject();
    2.测试当前用户是否已经被认证,即是否已经登陆, currentUser.isAuthenticated()
    3.若没有认证则/把用户名和密码封装为UsernamePasswordToken对象
        -创建一个表单
        -把请求提交到spriingmvc 的handler
        -获取用户和密码
    4.执行登陆 currentUser.login(token);
    5.自定义Relam方法,从数据库中获取相应的记录,返回给Shiro
        -实际上是需要集成org.apache.shiro.realm.AuthenticatingRealm
        -实现doGetAuthenticationInfo()方法
    6.有shiro完成对密码的比对

     测试使用到的文件:

    下面开始代码过程:
    login.jsp页面的登陆标志代码:
        login
        <form action="shiro/login" method="post">
              username:<input type="text" name="username">
              password:<input type="password" name="password">
              <input type="submit" value="submit">
        </form>
     
    在application中
    <property name="filterChainDefinitions">
                <value>
                    /login.jsp = anon
                      /shiro/login = anon
                    # everything else requires authentication:
                    /** = authc
                </value>
            </property>

     ShiroHandler.java

    @Controller
    @RequestMapping("/shiro")
    public class ShiroHandler {
         @RequestMapping("/login")
         public String login(@RequestParam("username")String  username,@RequestParam("password") String password){
    
                 Subject currentUser = SecurityUtils.getSubject();
                 if (!currentUser.isAuthenticated()) {
                    //把用户名和密码封装为UsernamePasswordToken对象
                     UsernamePasswordToken token = new  UsernamePasswordToken(username, password);
                     token.setRememberMe(true);
                     try {
                          //执行登陆
                         currentUser.login(token);
                     }catch (AuthenticationException ae) {
                         System.out.println("登陆失败" +  ae.getMessage());
                     }
                 }
    
               成功之后做重定向
               return "redirect:/list.jsp";
         }
    }

     在applicationContext中需要扫描这个类的包

     ShiroRealm.java

    做登陆验证实现下面的接口即可
    doGetAuthenticationInfo(AuthenticationToken arg0)的arg0是指就是UsernamePasswordToken token = new  UsernamePasswordToken(username, password);
    public class ShiroRealm extends AuthenticatingRealm {
    
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {
            System.out.println("doGetAuthenticationInfo" + arg0);
    
            //1.把AuthenticationToken转为UsernamePasswordToken
            UsernamePasswordToken  upToken = (UsernamePasswordToken) arg0;
            
           //2.从UsernamePasswordToken获取username
            String username = upToken.getUsername();
            
            //3.调用数据库的方法,从数据库查询username对应的用户记录
            System.out.println("从数据库中获取username:" + username);
            
            //4.若用户不存在可以抛出异常 UnKnownAccountException异常
            if("unknow".equals(username)){
                throw new UnknownAccountException("username 不存在");
            }
            //5.根据用户信息的清空决定是否需要抛出其他的异常
            if("monster".equals(username)){
                throw new LockedAccountException("用户被锁定");
            }
            //6.根据用户的情况来构建AuthenticationInfo并且返回
            //以下信息是从数据库中获取的
            //principal:认证的实体信息,可以是username,也可以是数据表对应的实体对象
            Object principal = username;
            //credentials:密码
            Object credentials = "1234";
            //realmName:当前realm对象为name,调用父类的getName()方法即可
            String realmName = getName();
            SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(principal, credentials, realmName);
    
            return info;
        }
    }

    当我们输入密码为1234,以及其他为username(除了上图的两个)
    此时我们就有权限对其他的页面进行测试

     

    出错之后的异常还是会打印的

     

     此时我们需要登出的操作

    list.jsp
    <body>
        list.
        
        <a href="shiro/logout">Logout</a>
      </body>

     在applicationContext.xml文件中:

      <!--
                配置那些页面需要受保护,以及访问这些页面需要的的权限
                
                1)anon 可以被匿名访问
                2)authc 必须认证即登陆后才可以访问的页面
                3).logout登出
            -->
            <property name="filterChainDefinitions">
                <value>
                    /login.jsp = anon
                      /shiro/login = anon
                      /shiro/logout = logout
                      
                    # everything else requires authentication:
                    /** = authc
                </value>
            </property>

     但我们点击这个超链接的 时候就会立马退出来到login.jsp页面中

  • 相关阅读:
    SqlServer中插入无时间的日期
    IEnumerable的扩展方法
    JQuery插件之Autocomplete
    Visual Studio2010 即时生成序列图
    SQLSERVER系统表应用之基于Table生成存储过程参数列表
    格式化代码之自动加Region
    SQLSERVER2008使用CTE转换string到Table
    SQLSERVER使用CLR Stored Procedure导出数据到Excel
    SQLSERVER中找出拙劣的约束,索引,外键
    SQLSERVER2008中CTE的Split与CLR的性能比较
  • 原文地址:https://www.cnblogs.com/Mrchengs/p/9980910.html
Copyright © 2011-2022 走看看