Shiro自定义Realms

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;


@Service
public 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>
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页