博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小白用shiro(1)
阅读量:4873 次
发布时间:2019-06-11

本文共 5524 字,大约阅读时间需要 18 分钟。

本文来自网易云社区

作者:王飞

首先引入一段关于shiro的介绍:

开发系统中,少不了权限,目前java里的权限框架有SpringSecurity和Shiro(以前叫做jsecurity),对于SpringSecurity:功能太过强大以至于功能比较分散,使用起来也比较复杂,跟Spring结合的比较好。对于初学Spring Security者来说,曲线还是较大,需要深入学习其源码和框架,配置起来也需要费比较大的力气,扩展性也不是特别强。

对于新秀Shiro来说,好评还是比较多的,使用起来比较简单,功能也足够强大,扩展性也较好。听说连Spring的官方都不用Spring Security,用的是Shiro,足见Shiro的优秀。网上找到两篇介绍: ,http://itindex.net/detail/50410-apache-shiro-%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C,官网 ,使用和配置起来还是比较简单。

下面只是简单介绍下我们是如何配置和使用Shiro的。

pom.xml引入相关jar包

1             
 2             
 3                 
org.apache.shiro
 4                 
shiro-spring
 5                 
1.4.0
 6             
 7             
 8             
 9                 
org.apache.shiro
10                 
shiro-ehcache
11                 
1.4.0
12             
13             
14             
15                 
org.apache.shiro
16                 
shiro-core
17                 
1.4.0
18             

 web.xml增加过滤

 1     
 2     
 3         
shiroFilter
 4         
org.springframework.web.filter.DelegatingFilterProxy
 5     
 6  7     
 8         
shiroFilter
 9         
/*
10     

 增加一个shiro.xml的配置文件

  1 
 2 
13 14     
15 16 17     
18     
19         
20         
21         
22 23     24 25     
26     
27         
28         
29     30 31     
32         
33         
34         
35     36 37     
38     
39         
40         
41         
42         
43         
44             
45                 /api/**=anon46                 /res/**=anon47                 /src/**=anon48                 /health/**=anon49                 /logout=authc50                 /openid=anon51                 /callback=anon52                 /=authc53                 /**=anon54             
55         56     57 58 59     
60     
61 62 

 对bean的扫描配置

1     
2     
3 4     
5         
6     

 UserRealm

  1 @Component 2 public class UserRealm extends AuthorizingRealm { 3  4     private Logger logger = org.slf4j.LoggerFactory.getLogger(UserRealm.class); 5  6     public final static String CREDENTIALS = "openid"; 7  8     @Autowired 9     private SessionService sessionService;10     @Autowired11     private PermissionService permissionService;12 13     // 记录是否已经设置过PemissionResover14     private boolean hasSetPemissionResover = false;15 16     @Override17     public PermissionResolver getPermissionResolver() {18         if (!hasSetPemissionResover) {19             setPermissionResolver(new WildcardExtPermissionResolver());20             hasSetPemissionResover = true;21         }22         return super.getPermissionResolver();23     }24 25     /**26      * 获取授权信息27      *28      * @param principals29      * @return30      */31     @Override32     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {33         try {34             Iterator
 iter = principals.fromRealm(getName()).iterator();35             if (!iter.hasNext()) {36                 logger.info("shiro 验证 无权限");37                 return null;38             }39             String email = iter.next();40             if (!Strings.isNullOrEmpty(email)) {41                 // set session42                 SessionObject so = sessionService.getSession(email);43                 if (so == null) {44                     logger.info("so 缓存为空");45                     return null;46                 }47                 SessionUtils.setSo(so);48 49                 // set auth50                 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();51                 info.addStringPermissions(permissionService.getPermsForUser(so.getRoleId()));52                 return info;53             }54             logger.info("邮箱为空");55             return null;56         } catch (Exception e) {57             logger.error("shiro 权限获取异常:", e);58             return null;59         }60     }61 62     /**63      * 获取身份验证相关信息:64      *65      * @param authcToken66      * @return67      * @throws AuthenticationException68      */69     @Override70     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {71         try {72             UsernamePasswordToken token = (UsernamePasswordToken) authcToken;73             String email = token.getUsername();74             String password = new String(token.getPassword());75             if (!StringUtils.isEmpty(email) && CREDENTIALS.equals(password)) {76                 SessionObject so = SessionUtils.getSo();77                 sessionService.addOrUpdateSession(so);78                 return new SimpleAuthenticationInfo(email, CREDENTIALS, getName());79             }80             logger.info("登录验证失败,shiro 不添加权限信息");81             return null;82         } catch (Exception e) {83             logger.error("shiro 身份验证异常:", e);84             return null;85         }86     }87 88 89 }

登录调用

              UsernamePasswordToken token = new UsernamePasswordToken(                     "username", "password", true);              SecurityUtils.getSubject().login(token);

退出调用

1 SecurityUtils.getSubject().logout();

权限注解

@RequiresPermissions(value = {"ROLE_KEY"})

 

网易云,0成本体验20+款云产品! 

更多网易研发、产品、运营经验分享请访问。

相关文章:

【推荐】 
【推荐】 
【推荐】 

转载于:https://www.cnblogs.com/163yun/p/9728229.html

你可能感兴趣的文章
经典变量练习
查看>>
SQL注入学习总结(四):SQL注入中的绕过
查看>>
Ajax笔记
查看>>
Nginx配置文件详细说明
查看>>
python遇到的问题汇总
查看>>
DBGRID 拖动滚动条 和 鼠标滚轮的问题
查看>>
快速排序、冒泡排序
查看>>
多个Tomcat同时启动的解决方案
查看>>
opencv
查看>>
VC/MFC非模态对话框实例
查看>>
编译器错误 CS0714和CS0715
查看>>
bzoj 3522 [Poi2014]Hotel 树形dp
查看>>
Deepin-安装laravel
查看>>
Linux 系统启动过程
查看>>
华为机试之广度优先遍历
查看>>
IE内核浏览器localStorage的一个大坑
查看>>
洛谷P4551最长异或路径(Trie树)
查看>>
Linux服务器iops性能测试-iozone
查看>>
C# 切图
查看>>
LeetCode 169. Majority Element解题方法
查看>>