Shiro自定义Realms

来源:互联网 发布:gsm是什么网络 编辑:程序博客网 时间:2024/05/19 05:06

Shiro 的三个核心组件:Subject, SecurityManager 和 Realms.

来回顾一下这三个组件的关系

Shiro 的三个核心组件

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>
0 0