Shiro授权及注解式开发

摘要:
目的:  shiro授权  shiro注解式开发Shiro授权首先设计shiro权限表:从图中我们也清晰的看出五张表之间的关系ShiroUserMapperSetgetRolesByUserId(Integeruid);SetgetPersByUserId(Integeruid);ShiroUserMapper.xml˂selectid="getRolesByUse

目的:

  shiro授权

  shiro注解式开发


Shiro授权

首先设计shiro权限表:

从图中我们也清晰的看出五张表之间的关系

Shiro授权及注解式开发第1张

ShiroUserMapper

Set<String>getRolesByUserId(Integer uid);

    Set<String> getPersByUserId(Integer uid);

ShiroUserMapper.xml

<select id="getRolesByUserId"resultType="java.lang.String"parameterType="java.lang.Integer">select r.roleid from t_shiro_user u,t_shiro_user_role ur,t_shiro_role r
    where u.userid = ur.userid and ur.roleid = r.roleid
    and u.userid = #{uid}
</select>
  <select id="getPersByUserId"resultType="java.lang.String"parameterType="java.lang.Integer">select p.permission from t_shiro_user u,t_shiro_user_role ur,t_shiro_role_permission rp,t_shiro_permission p
  where u.userid = ur.userid and ur.roleid = rp.roleid and rp.perid = p.perid
  and u.userid = #{uid}
</select>

Service层

ShiroUserService

    /*** 角色验证
     * @paramuid
     * @return
     */Set<String>getRolesByUserId(Integer uid);

    /*** 权限判断
     * @paramuid
     * @return
     */Set<String> getPersByUserId(Integer uid);

ShiroUserServiceIpml

@Service("shiroUserService")
public class ShiroUserServiceImpl implementsShiroUserService {
    @Autowired
    privateShiroUserMapper shiroUserMapper;
    @Override
    publicShiroUser queryByName(String userName) {
        returnshiroUserMapper.queryByName(userName);
    }
    @Override
    public intinsert(ShiroUser shiroUser) {
        returnshiroUserMapper.insert(shiroUser);
    }

   @Override
    public Set<String> getRolesByUserId(Integer uid) {
        return shiroUserMapper.getRolesByUserId(uid);
    }

    @Override
    public Set<String> getPersByUserId(Integer uid) {
        returnshiroUserMapper.getPersByUserId(uid);
    }
}

编写MyRealm中的授权方法去获取数据源

public class MyRealm extendsAuthorizingRealm {
    privateShiroUserService shiroUserService;

    publicShiroUserService getShiroUserService() {
        returnshiroUserService;
    }

    public voidsetShiroUserService(ShiroUserService shiroUserService) {
        this.shiroUserService =shiroUserService;
    }
    /*** 授权
     * @paramprincipalCollection
     * @return
     */@Override
    protectedAuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        ShiroUser shiroUser = this.shiroUserService.queryByName(principalCollection.getPrimaryPrincipal().toString());
        Set<String> roleids = this.shiroUserService.getRolesByUserId(shiroUser.getUserid());
        Set<String> perIds = this.shiroUserService.getPersByUserId(shiroUser.getUserid());
        SimpleAuthorizationInfo info = newSimpleAuthorizationInfo();
        info.setRoles(roleids);
        info.setStringPermissions(perIds);
        returninfo;
    }
}

Shiro注解式开发

常用注解介绍

@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

注意: 必须将Shiro注解的开启放置到spring-mvc.xml中(即放在springMVC容器中加载),不然Shiro注解开启无效!

所以我们要在Springmvc文件中配置他

Springmvc.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中运用注解

/*** @author黄大娘
 * @company dogsun
 * @oreata 2019-10-14 21:28
 */@Controller
public classShiroUserController {
    @Autowired
    privateShiroUserService shiroUserService;/*** 讲解身份认证的注释
     * @paramreq
     * @paramresp
     * @return
     */@RequiresUser
    @RequestMapping("/passUser")
    publicString passUser(HttpServletRequest req, HttpServletResponse resp){
        return "admin/addUser";
    }

    /*** 角色认证的注释
     * 此方法只有同时具备1.4两个角色id,才能访问
     * @paramreq
     * @paramresp
     * @return
     */@RequiresRoles(value = {"1","4"},logical =Logical.AND)
    @RequestMapping("/passRole")
    publicString passRole(HttpServletRequest req, HttpServletResponse resp){
        return "admin/listUser";
    }

    /*** 如果角色,身份,权限的认证失败后的处理方式
     * @paramreq
     * @paramresp
     * @return
     */@RequestMapping("/unauthorized")
    publicString ht(HttpServletRequest req, HttpServletResponse resp){
        System.out.print("处理错误的方式!!!");
        return "login";
    }
    /*** 权限认证的注释
     *
     * @paramreq
     * @paramresp
     * @return
     */@RequiresPermissions(value = {"user:update","user:view"},logical =Logical.OR)
    @RequestMapping("/passPer")
    publicString passPer(HttpServletRequest req, HttpServletResponse resp){
        return "admin/resetPwd";
    }}

main.jsp测试

<ul>shiro注解
    <li>
        <a href="${pageContext.request.contextPath}/passUser">身份认证</a>
    </li>
    <li>
        <a href="${pageContext.request.contextPath}/passRole">角色认证</a>
    </li>
    <li>
        <a href="${pageContext.request.contextPath}/passPer">权限认证</a>
    </li>
</ul>

谢谢观看!

免责声明:文章转载自《Shiro授权及注解式开发》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇easyui学习记录:Layout(布局)的使用Visdom 介绍 | 二下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

设置Shiro超时时间

1、在shiro的配置文件中配置。 <!-- 会话管理器 --> <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <!-- 设置超时时间 --> <prope...

shiro的单机版 和 集群版

在我们的开发当中 我们一般权限都是个 比较繁琐 但又必不可少的 一部分 【不管我们的 数据库设计 还是我们采用何种技术 我们的权限库表 大多都是大同小异 业务逻辑也是如此】 在我们不使用任何框架的时候 我们也是可以做到 但是细节过于麻烦 在很多时候 都是重复造轮子的过程 所以出现了 很多开源比较休息的额权限框架如:shiro Spring security...

shiro中INI配置

4.1 根对象SecurityManager 从之前的Shiro架构图可以看出,Shiro是从根对象SecurityManager进行身份验证和授权的;也就是所有操作都是自它开始的,这个对象是线程安全且真个应用只需要一个即可,因此Shiro提供了SecurityUtils让我们绑定它为全局的,方便后续操作。 因为Shiro的类都是POJO的,因此都很容易放...

Java审计之CMS中的那些反序列化漏洞

Java审计之CMS中的那些反序列化漏洞 0x00 前言 过年这段时间比较无聊,找了一套源码审计了一下,发现几个有意思的点拿出来给分享一下。 0x01 XStream 反序列化漏洞 下载源码下来发现并不是源代码,而是一个的文件夹,里面都已经是编译过的一个个class文件。 在一个微信回调的路由位置里面找到通过搜索类名 Serialize关键字找到了一个工具...

SpringBoot中Shiro处理ajax请求(重写UserFilter)

首先道歉 没经过充分的测试就发文了 后来在review的时候发现我在map中同一个key塞了俩对象 这样只有最后添加的有效 在看了shiro相关文档之后找到了有效的解决方法 文章末尾我会补上Shiro自带的拦截器相关内容 写一个Shiro的过滤器 继承org.apache.shiro.web.filter.authc.UserFilter import c...

Shiro 性能优化:解决 Session 频繁读写问题

背景 应对思路 代码实现 背景 Shiro 提供了强大的 Session 管理功能,基于 Shiro 实现 Session 共享非常方便,只需要定制一个我们自己的SessionDAO,并将它绑定给 SessionManager 即可。在我们的 SessionDAO 中,通常会将 Session 保存到 Redis,那么 Shiro 对 Sess...