【Saas-export项目】19.2--apache shiro过滤器、标签、用户登录加密验证

48 篇文章 1 订阅
37 篇文章 3 订阅



Shiro过滤器&标签简介

判断 sesion中是否有 user 判断账户密码是否正确

分析:

需要过滤器控制 没有权限下访问链接
需要标签控制 没有权限下 界面元素的隐藏

(1)Shiro过滤器

anon代表不认证也可以访问,通常对静态资源进行放行
authc代表必须通过认证才可以访问,通常对动态资源(controller,jsp页面)进行拦截,如果用户没有认证,Shiro会自动跳转到login.jsp页面
在这里插入图片描述

(2)Shiro标签

  • 1.shiro:authenticated (表示已认证通过,但不包括remember me登录的)

说明:只有已通过用户认证,但不是通过记住我(remember me)浏览才会看到标签内的内容

  • 2.shiro:guest (表示是游客身份,没有登录)

说明:只有是没有登录过,以游客的身份浏览才会看到标签内的内容

  • 3.shiro:hasAnyRoles(表示拥有这些角色中其中一个)

说明:只有成功登录后,且具有admin或者user角色的用户才会看到标签内的内容;name属性中可以填写多个角色名称,以逗号(,)分隔

  • 4.shiro:hasPermission(表示拥有某一权限)

说明:只有成功登录后,且具有admin:add权限的用户才可以看到标签内的内容,name属性中只能填写一个权限的名称

  • 5.shiro:hashRole (表示拥有某一角色)

说明:只有成功登录后,且具有admin角色的用户才可以看到标签内的内容,name属性中只能填写一个角色的名称

  • 6.shiro:lacksPermission (表示不拥有某一角色)

说明:只有成功登录后,且不具有admin:delete权限的用户才可以看到标签内的内容,name属性中只能填写一个权限的名称

  • 7.shiro:lacksRole (表示不拥有某一角色)

说明:只有成功登录后,且不具有admin角色的用户才可以看到标签内的内容,name属性中只能填写一个角色的名称

  • 8.shiro:notAuthenticated (表示没有通过验证)

说明:只有没有通过验证的才可以看到标签内的内容,包括通过记住我(remember me)登录的

  • 9.shiro:principal (表示用户的身份)

取值取的是你登录的时候,在Realm 实现类中的new SimpleAuthenticationInfo(第一个参数,…) 放的第一个参数:

1)如果第一个放的是username或者是一个值 ,那么就可以直接用。
2)如果第一个参数放的是对象,比如放User 对象。那么如果要取其中某一个值,可以通过property属性来指定。

  • 10.shiro:user (表示已登录)

说明:只有已经登录(包含通过记住我(remember me)登录的)的用户才可以看到标签内的内容;一般和标签shiro:principal一起用,来做显示用户的名称

Shiro登陆认证-判断session中的user

  • (1)过滤器
    在项目中使用认证过滤器拦截资源(该拦截的拦截,该放行的放行)
  • (2)authc认证过滤器
    必须认证才能访问,如果未认证跳登录页
  • (3)anon过滤器
    放行,不需要拦截认证
  • (4)拦截路径问题
/ 不会拦截页面,只会拦截路径访问。
/* 和 /**拦截页面,也拦截路径访问。
/* 拦截所有的文件夹,不包含子文件夹(/*只有后面一级)
/** 是拦截所有的文件夹及里面的子文件夹(/**可以包含多级)

applicationContext-shiro.xml

export_web_manager\src\main\resources\spring

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!--注入SecurityManager-->
        <property name="securityManager" ref="securityManager"/>

        <property name="filterChainDefinitions">
            <value>
                <!-- 如果请求提静态资源 anon 不要求session中有user,直接可以访问-->
                /css/**=anon
                /img/**=anon
                /plugins/**=anon
                <!-- 如果请求login.do方法 anon-->
                /system/user/login-shiro.do=anon
                <!--             /company/toList.do = perms["企业管理"]-->
                <!-- 如果除以上之后的xxx.do 要求登录 authc查询session中是否有user-->
                /**=authc
            </value>
        </property>
        <!--如果 session就是没有user,表示未登录,页面转到login-shiro.jsp -->
        <property name="loginUrl" value="/login-shiro.jsp"/>
        <property name="unauthorizedUrl" value="/unauthorized.jsp"/>

    </bean>

在这里插入图片描述

Shiro登录认证-用户密码判断

(1)Shiro登陆认证三种结果

  • (1)正确
    无异常
    User user = (User)subject.getPrincipal()//获取user对象
  • (2)用户不存在
    程序抛出UnknownAccountException异常
  • (3)用户密码出错
    程序抛出IncorrectCredentialsException异常

(2)Shiro登陆认证login方法

  • (1) 获取Subject对象
    Subject subject = SecurityUtils.getSubject();
  • (2)调用Subject的认证方法 : login 本质:AuthRealm的认证方法
    subject.login(token);
  • (3)登录的结果
    正确
    用户不存在
    用户密码出错

UserController.java

export_web_manager\src\main\java\com\smp\web\controller\system\user

//${path}/system/user/login-shiro.do
    @RequestMapping(path = "/login-shiro", method = {RequestMethod.GET, RequestMethod.POST})
    public String loginShiro(String email,String password) {
        //根据 email查询对应的用户
        l.info("loginShiro email " + email);
        l.info("loginShiro password " + password);
        //使用shiro框架进行认证  结果也是三种可能  正确 没有异常,用户不存在 UnknownAccountException,密码出错 IncorrectCredentialsException
        //本质是需要调用realm进行查找用户
        Subject subject = SecurityUtils.getSubject();//获取连接
        //1:先获取subject 表示对securitymanager连接
        //2:调用 securitymanager
        //3:再调用realm
        //难验信息
        UsernamePasswordToken token = new UsernamePasswordToken(email, password);//身份验证
        try {
            subject.login(token);//正确  --realm
            //正确
            l.info("正确");
            //保存用户信息
            //要求访问realm返回一个user对象
            User user = (User) subject.getPrincipal();//  --realm
            session.setAttribute("loginUser",user);
            //一个 Module对象 就是左侧栏上的一个菜单项
            List<Module> menus = iModuleService.findModuleByUser(user);
            session.setAttribute("menus",menus);
            l.info("login menus "+menus);
            //跳到主页
            return "redirect:/home/toMain.do";
        } catch (UnknownAccountException e) {//用户不存在
            e.printStackTrace();
            l.info("用户不存在");
            request.setAttribute("error","用户不存在");
            return "forward:/login-shiro.jsp";
        }catch (IncorrectCredentialsException e){//密码出错
            e.printStackTrace();
            l.info("密码不对");
            request.setAttribute("error","邮箱或者密码不对");
            return "forward:/login-shiro.jsp";
        }


    }

AuthRealm.java

export_web_manager\src\main\java\com\smp\web\shiro

//认证(登录账号密码)
    //subject.login(token);
    //参1 接受 subject.login(token); 方法的值  authenticationToken
    @Autowired
    IUserService userService;
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        l.info("AuthRealm doGetAuthenticationInfo 函数执行");
        //响应login方法和getPrincipal方法的调用
        UsernamePasswordToken usernamePasswordToken= (UsernamePasswordToken) token;

        String email  = usernamePasswordToken.getUsername();
        l.info("doGetAuthenticationInfo --"+email);
        //调service读dao
        User user =  userService.findUserByEmail(email);
        l.info("doGetAuthenticationInfo --"+user);
        if (user == null) {
            //用户不存在
            return null;//-->系统会将null转成UnknownAccountException抛出
        } else {
            //用户存在的
            //AuthenticationInfo 返回给 User user = (User) subject.getPrincipal();
            /**
             * 参数一:principal,存放用户登录信息,subject.getPrincipal()获取
             * 参数二:数据库的密码
             * 参数三:realm的别名,只有在多个Realm的时候才会用,一般不用
             */
            AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), "");
            return info;
        }
    }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值