5分钟上手Shiro认证功能与注解式开发

目录

一、Shiro认证

二、注解式开发


一、Shiro认证

上次我们分享了Shiro框架的认证功能,在这里我们继续分享Shiro框架的功能之一:授权

①UserMapper.xml添加两个方法

<select id="getRolesByUserId" resultType="java.lang.String" parameterType="java.lang.String">
    SELECT roleid FROM t_shiro_user_role ur,t_shiro_user u where ur.userid=u.userid and u.username=#{userName}
  </select>

  <select id="getPersByUserId" resultType="java.lang.String" parameterType="java.lang.String">
    SELECT rp.perid FROM t_shiro_user u,
      t_shiro_user_role ur,
      t_shiro_role_permission rp
      where ur.userid=u.userid
      and ur.roleid=rp.roleid
      and u.username= #{userName}
  </select>

 ②对应的server层、biz层添加两个方法

UserMapper:

    Set<String> getRolesByUserId(@Param("userName") String userName);

    Set<String> getPersByUserId(@Param("userName") String userName);

UserBiz:

    Set<String> getRolesByUserId(String userName);

    Set<String> getPersByUserId(String userName);

UserBizImpl:

    @Override
    public Set<String> getRolesByUserId(String userName) {
        return userMapper.getRolesByUserId(userName);
    }

    @Override
    public Set<String> getPersByUserId(String userName) {
        return userMapper.getPersByUserId(userName);
    }

③改变配置文件中的授权字段:

 ④自定义的Realm添加授权方法:

业务流程:
  1) 获取验证身份(用户名)
  2) 根据身份(用户名)获取角色和权限信息
  3) 将角色和权限信息设置到SimpleAuthorizationInfo

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        String userName = principals.getPrimaryPrincipal().toString();//获取账户名
        Set<String> roleIds = userBiz.getRolesByUserId(userName);
        Set<String> perIds = userBiz.getPersByUserId(userName);
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//       将当前登录的权限交给shiro的授权器
        info.setStringPermissions(perIds);
//        将当前登录的角色交给shiro的授权器
        info.setRoles(roleIds);
        return info;
    }

⑤效果演示: 

 


二、注解式开发

①常用注解:

@RequiresAuthenthentication:表示当前Subject已经通过login进行身份验证;即 Subject.isAuthenticated()返回 true

@RequiresUser:表示当前Subject已经身份验证或者通过记住我登录的

@RequiresGuest:表示当前Subject没有身份验证或者通过记住我登录过,即是游客身份

@RequiresRoles(value = {"admin","user"},logical = Logical.AND):表示当前Subject需要角色admin和user

@RequiresPermissions(value = {"user:delete","user:b"},logical = Logical.OR):表示当前Subject需要权限user:delete或者user:b

②将我们需要的注解添加到方法上:

身份认证:requireUser

角色认证:requireRole

权限认证: requirePermission

③在springmvc-servlet.xml中添加拦截器相关配置 

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
      depends-on="lifecycleBeanPostProcessor">
    <property name="proxyTargetClass" value="true"></property>
</bean>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    <property name="securityManager" ref="securityManager"/>
</bean>
 
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key="org.apache.shiro.authz.UnauthorizedException">
                unauthorized
            </prop>
        </props>
    </property>
    <property name="defaultErrorView" value="unauthorized"/>
</bean>
 

 ④添加Controller进行验证:

package com.zq.ssm.controller;

import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.authz.annotation.RequiresUser;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@RequestMapping("/shiro")
@Controller
public class ShiroController {
    //   RequiresUser代表 当前方法只有登录后才能够访问
//    RequiresUser等价于spring-shiro.xml中的/user/updatePwd.jsp=authc配置
    @RequiresUser
    @RequestMapping("/passUser")
    public String passUser() {
        System.out.println("身份认证通过!");
        return "admin/addUser";
    }

    //RequiresRoles 代表当前方法只有具备指定的角色才能访问
//    RequiresRoles等价于spring-shiro.xml中的/admin/*.jsp=roles[4]配置
    @RequiresRoles(value = {"1", "4"}, logical = Logical.AND)
    @RequestMapping("/passRole")
    public String passRole() {
        System.out.println("角色认证通过!");
        return "admin/addUser";
    }

    //RequiresRoles 代表当前方法只有具备指定的权限才能访问
//    RequiresRoles等价于spring-shiro.xml中的/user/teacher.jsp=perms[2]配置
    @RequiresPermissions(value = {"2"}, logical = Logical.AND)
    @RequestMapping("/passPermission")
    public String passPermission() {
        System.out.println("权限认证通过!");
        return "admin/addUser";
    }
}

注意: 

 @RequiresRoles(value = {"1", "4"}, logical = Logical.AND)代表必须同时满足角色1和角色4同时认证才能通过;

 @RequiresRoles(value = {"1", "4"}, logical = Logical.OR)代表必须满足角色1或者角色4任意一方认证就能通过;

⑤效果演示:

1)当我们不登录进行验证:

报错: 

 2)登录只有角色1的账户访问角色认证请求:

 

报错:

  3)登录满足权限1和权限4的的账户访问授权请求:

 

通过:

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃头没秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值