文档章节

shiro 使用

_______-
 _______-
发布于 2016/09/04 23:44
字数 801
阅读 656
收藏 13

在使用Shiro标签库前,首先需要在JSP引入shiro标签:
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>

1、介绍Shiro的标签guest标签 :验证当前用户是否为“访客”,即未认证(包含未记住)的用户。
<shiro:guest>
Hi there!  Please <a href="login.jsp">Login</a> or <a href="signup.jsp">Signup</a> today!
</shiro:guest>

2、user标签 :认证通过或已记住的用户。
<shiro:user>
 Welcome back John!  Not John? Click <a href="login.jsp">here<a> to login.
</shiro:user>

3、authenticated标签 :已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。
<shiro:authenticated>
    <a href="updateAccount.jsp">Update your contact information</a>.
</shiro:authenticated>

4、notAuthenticated标签 :未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。
<shiro:notAuthenticated>
    Please <a href="login.jsp">login</a> in order to update your credit card information.
</shiro:notAuthenticated>

 

5、principal 标签 :输出当前用户信息,通常为登录帐号信息。
Hello, <shiro:principal/>, how are you today?

 

6、hasRole标签 :验证当前用户是否属于该角色。
<shiro:hasRole name="administrator">
    <a href="admin.jsp">Administer the system</a>
</shiro:hasRole>

 

7、lacksRole标签 :与hasRole标签逻辑相反,当用户不属于该角色时验证通过。
<shiro:lacksRole name="administrator">
    Sorry, you are not allowed to administer the system.
</shiro:lacksRole>

 

8、hasAnyRole标签 :验证当前用户是否属于以下任意一个角色。
<shiro:hasAnyRoles name="developer, project manager, administrator">
    You are either a developer, project manager, or administrator.
</shiro:lacksRole>

 

9、hasPermission标签 :验证当前用户是否拥有指定权限。
<shiro:hasPermission name="user:create">
    <a href="createUser.jsp">Create a new User</a>
</shiro:hasPermission>

10、lacksPermission标签 :与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过。    
<shiro:hasPermission name="user:create">
    <a href="createUser.jsp">Create a new User</a>
</shiro:hasPermission>

 


=======================================================================================================
1.web.xml 添加shiro入口
 <!--- shiro 1.2 -->
    <listener>
        <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>shiroEnvironmentClass</param-name>
        <param-value>org.apache.shiro.web.env.IniWebEnvironment</param-value><!-- 默认先从/WEB-INF/shiro.ini,如果没有找classpath:shiro.ini -->
    </context-param>
    <context-param>
        <param-name>shiroConfigLocations</param-name>
        <param-value>classpath:shiro.ini</param-value>
    </context-param>
    <filter>
        <filter-name>shiroFilter</filter-name>
        <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>shiroFilter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

2.shiro.ini   在src下面添加shiro配置文件
[main]
myRealm=com.aih.plugin.shiro.MyAuthorizingRealm
securityManager.realms=$myRealm
#默认是/login.jsp
authc.loginUrl=/login
roles.unauthorizedUrl=/unauthorized
perms.unauthorizedUrl=/unauthorized
logout.redirectUrl=/login

[urls]
/logout2=logout
/login=anon
/logout=anon
/unauthorized=anon
/static/**=anon
/authenticated=authc

 

3.自定义角色和用户菜单权限,需要重写realms
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authc.AccountException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationException;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.dodo.framework.helper.BeanHelper;

import com.aih.admin.model.system.Menu;
import com.aih.admin.model.system.Role;
import com.aih.admin.model.system.User;
import com.aih.admin.service.system.MenuService;
import com.aih.admin.service.system.RoleService;
import com.aih.admin.service.system.UserService;

public class MyAuthorizingRealm extends AuthorizingRealm{
    UserService userService=BeanHelper.getBean(UserService.class);
    MenuService menuService =BeanHelper.getBean(MenuService.class);
    RoleService roleService=BeanHelper.getBean(RoleService.class);
    /*
     * 检查用户是否拥有对应菜单的权限
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        if (principals == null) {
            throw new AuthorizationException("PrincipalCollection method argument cannot be null.");
        }
        String username = (String) getAvailablePrincipal(principals);
        User user = userService.getUserByLoginName(username);
        if(user!=null){
            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
            Map<String,String> p=new HashMap<String,String>();
            List<Menu> list =menuService.getList(p);
            for (Menu menu : list){
                if (StringUtils.isNotBlank(menu.getPermission())){
                    // 添加基于Permission的权限信息
                    for (String permission : StringUtils.split(menu.getPermission(),",")){
                        info.addStringPermission(permission);
                    }
                }
            }
            // 添加用户权限
            info.addStringPermission("user");
            // 添加用户角色信息
            List<Role> roles=roleService.getRolesByLoginName(username);
            for (Role role : roles){
                info.addRole(role.getEnname());
            }
            return info;
        }else{
            return null;
        }
        
    }

    /*
     * 检查用户是否登录权限
     */
    @SuppressWarnings("unused")
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token){
        UsernamePasswordToken upToken = (UsernamePasswordToken) token;
        String username = upToken.getUsername();
        if (username == null) {
            throw new AccountException("Null usernames are not allowed by this realm.");
        }
        String password="123";
        if(password==null){
            throw new AccountException("account error...");
        }
        AuthenticationInfo info = new SimpleAuthenticationInfo(username, password, getName());
        return info;
    }


}

4.对应的加上权限代码
Subject subject = SecurityUtils.getSubject();
subject.checkRole("admin");
subject.checkPermission("sys:dict:view");

 

© 著作权归作者所有

_______-
粉丝 4
博文 97
码字总数 38756
作品 0
宝山
程序员
私信 提问
加载中

评论(1)

8446666
8446666
Apache Shiro 权限控制实战,权限控制Demo,SpringMVC + Mybatis + Shiro 项目下载
http://www.sojson.com/shiro
#Shiro Demo#
JFinal的Shiro权限管理插件 2.0 版发布,支持JFinal 2.0

JFinal的Shiro权限管理插件 更新说明: 1)支持JFinal2.0 2)添加了一些实际项目中的代码供参考。 3)由于shiro需要与具体的业务整合才能使用,所以这个插件仅仅是方便在jfinal中使用shiro。...

玛雅牛
2015/08/18
6.1K
24
云梦/shiro-struts2

#shiro-struts2 简单整合,更强及自身业务需要自己实现扩展 shiro本身是插件式的,所以ORM层框架可更换,web层框架可更换, 使用shiro最简单的是使用shiro本身提供的已有的类,自己只需扩展一...

云梦
2014/10/29
0
0
玛雅牛/JFinalShiroPlugin

#JFinalShiroPlugin JFinal的Shiro插件,实现权限管理。 升级说明 2017年6月11日 支持JFinal 3.0/3.1 版本。 dist里的文件, 使用JFinal 1.x版本,请使用jfinal-shiro-1.0.0.jar。 使用JFi...

玛雅牛
2014/04/23
0
0
Shiro学习系列教程四:集成web(二)

本讲主要内容: 1:shiro对访问URL可使用通配符进行匹配 2:shiro标签的使用 3:shiro会话的机制 URL匹配方式: 演示: 现在shiro.ini配置的路径为: 直接访问/admin Ok.没问题。 那么我们访...

799879287
2017/10/21
0
0
springboot(十四):springboot整合shiro-登录认证和权限管理

这篇文章我们来学习如何使用Spring Boot集成Apache Shiro。安全应该是互联网公司的一道生命线,几乎任何的公司都会涉及到这方面的需求。在Java领域一般有Spring Security、Apache Shiro等安全...

ityouknow
2017/06/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于运维,该怎么决定它的方向,这个似工作又似兴趣的存在

我之前主要从事网络、桌面、机房管理等相关工作,这些工作使我迷惘,这应该是大多数运维人都经历过的过程; 18年国庆,我从国内前三的消费金融公司裸辞,下海创业,就是想要摆脱这样的困境。...

网络小虾米
23分钟前
5
0
Java Timer的用法

Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { System.out.println("11232"); } }, 200000 , 1000); public void schedule(TimerTask task, long delay......

林词
27分钟前
5
0
使用js动态加载外部js文件以及动态创建script脚本

动态脚本指的是在页面加载时不存在,但将来的某一时刻通过修改该DOM动态添加的脚本。和操作HTML元素一样,创建动态脚本也有两种方式:插入外部文件和直接插入JavaScript代码。 动态加载外的外...

Bing309
34分钟前
3
0
从零开始入门 K8s | Kubernetes 网络概念及策略控制

作者 | 阿里巴巴高级技术专家 叶磊 一、Kubernetes 基本网络模型 本文来介绍一下 Kubernetes 对网络模型的一些想法。大家知道 Kubernetes 对于网络具体实现方案,没有什么限制,也没有给出特...

阿里巴巴云原生
38分钟前
3
0
天气获取

本文转载于:专业的前端网站➨天气获取 $.get("http://wthrcdn.etouch.cn/WeatherApi", { citykey: cityCode }, function (d) { //创建文档对象 var parser = new ......

前端老手
38分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部