Shiro自定义Realms
来源:互联网 发布:gsm是什么网络 编辑:程序博客网 时间:2024/05/19 05:06
Shiro 的三个核心组件:Subject, SecurityManager 和 Realms.
来回顾一下这三个组件的关系
Subject
Subject:即“当前操作用户”。但是,在 Shiro 中,Subject 这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是 Shiro的“用户”概念。
Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
SecurityManager
SecurityManager:它是 Shiro 框架的核心,典型的 Facade 模式,Shiro 通过SecurityManager 来管理内部组件实例,并通过它来提供安全管理的各种服务。
Realm
Realm: Realm 充当了 Shiro 与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro 会从应用配置的 Realm中查找用户及其权限信息。
从这个意义上讲,Realm 实质上是一个安全相关的 DAO:它封装了数据源的连接细
节,并在需要时将相关数据提供给 Shiro。
当配置 Shiro 时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个 Realm 是可以的,但是至少需要一个。Shiro 内置了可以连接大量安全数据源(又名目录)的 Realm,如 LDAP、关系数据库(JDBC)、类似 INI 的文本配置资源以及属性文件等。如果缺省的 Realm 不能满足需求,你还可以插入代表自定义数据源的自己的 Realm 实现。
今天主要介绍一下如何自定义Realms
自定义Realms
继承org.apache.shiro.realm.AuthorizingRealm
重写doGetAuthenticationInfo和doGetAuthorizationInfo方法
doGetAuthenticationInfo方法是获取认证信息,也就是用户登录
doGetAuthorizationInfo方法是获取授权信息,也就查找用户的角色和权限,看是否有权操作
具体代码如下
package com.learn.shiro;import org.apache.shiro.authc.AuthenticationException;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.AuthorizationInfo;import org.apache.shiro.authz.SimpleAuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import com.test.entity.User;public class MyShiroRealm extends AuthorizingRealm { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private UserAuthService userAuthService; /*** * 获取授权信息,也就是看有没有权限操作 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { logger.info("-----授权-----"); User user = (User) principals.getPrimaryPrincipal(); SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); authorizationInfo.setRoles(userAuthService.findRoles(user)); authorizationInfo.setStringPermissions(userAuthService.findPermissions(user)); return authorizationInfo; } /*** * 获取认证信息,也就是用户登录 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException { logger.info("-----认证-----"); // 将AuthenticationToken转化为UsernamePasswordToken UsernamePasswordToken token = (UsernamePasswordToken) authcToken; // 从token中得到用户名和密码 String username = token.getUsername().trim(); String password = ""; if (token.getPassword() != null) { password = new String(token.getPassword()); } logger.info("-----username:{},password:{}-----", username, password); User user = userAuthService.login(username, password); if (user != null) { SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, password.toCharArray(), getName()); return info; } return null; }}
调用的UserService
package com.learn.shiro;import java.util.Set;import com.test.entity.User;public interface UserAuthService { /** * 登录 * * @param username * @param password * @return */ public User login(String username, String password); /** * 根据用户id查找其角色 * * @param user * @return */ public Set<String> findRoles(User user); /** * 根据用户id查找其权限 * * @param user * @return */ public Set<String> findPermissions(User user);}
Service就去调用自己写的dao了
package com.test.shiro;import java.util.Set;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.test.dao.UserDao;import com.test.entity.User;@Servicepublic class UserAuthServiceImpl implements UserAuthService { @Autowired UserDao userDao; /** * 验证登录 * * @param username * @param password * @return */ public User login(String username, String password) { return userDao.login(username, password); } public Set<String> findRoles(User user) { /* * Set<String> roles = new HashSet<>(); roles.add("user"); */ return null; // return loginUserDao.findRoles(userid); } public Set<String> findPermissions(User user) { return userDao.findPermissions(user); }}
最后在spring配置文件里配置自定义的shiroRealm
<bean id="myShiroRealm" class="com.test.shiro.MyShiroRealm"></bean> <!-- Shiro安全管理器 --><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="myShiroRealm"></property> <property name="cacheManager" ref="shiroCacheManager"></property></bean>
- Shiro自定义Realms
- Apache Shiro Realms
- 第六章:Shiro的Realms
- 【Shiro权限管理】13. SecurityManager配置realms
- 自学-Shiro中多个Realms的另外一种配置方式-11
- apache shiro自定义shiro
- shiro使用报错---One or more realms must be present to execute an authentication attempt.
- shiro中出现Caused by: java.lang.IllegalStateException: Configuration error: No realms have been config
- 自定义shiro
- shiro自定义Realm
- shiro 自定义logout路径
- shiro 自定义认证filter
- Shiro自定义Ream
- Shiro入门-自定义realm
- shiro自定义密码验证
- shiro自定义过滤器
- Shiro自定义Realm
- 自定义Shiro标签Tag
- 《Effective Java》笔记(一)
- Spring中使用AspectJ指示器
- POJ 1952 BUY LOW, BUY LOWER
- Rxjava(Subject)-PublishSubject--代码分析
- Robotium-环境搭建
- Shiro自定义Realms
- Android——android与JavaScript交互,告别WebView。
- C#42课主要内容
- leetcode_最长回文串Longest Palindromic Substring
- 隐藏显示控制(is/hide/show)
- 以ZeroMQ谈消息中间件的设计
- Nginx 配置优化
- mysql Error 1205: Lock wait timeout exceeded; try restarting transaction
- PhpExcel中文帮助手册|PhpExcel使用方法