shiro 不完全学习笔记-----------3

一.从数据库获取shiro所需要信息

1.血与泪的教训

注意:将spring-mvc.xml提前加载       否则shirofilter加载时   spring容器中bean并没有加载  所以导致bean注入失败问题

<!--配置spring容器的配置文件的位置-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/spring.xml,classpath:spring/spring-mvc.xml</param-value>
</context-param>


2.在自定义realm中,注入dao或service(数据库认证和授权的流程)

    用来执行认证或者授权

  (1) 认证流程

        (思路 :通过token获得principal  获得username    用username去数据库获得 user对象 将对象信息 

           给authentication(username,password),authentication注入盐   认证器会拿着你给他的信息  去和前台传入信息              进行比对,进行校验是否认证成功。

/**
 * 认证
 * @param authenticationToken  主体传过来的认证信息
 * @return
 * @throws AuthenticationException
 */
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
    // 1. 从主体传过来的认证信息中获取用户名
    String userName = (String) authenticationToken.getPrincipal();
    // 2. 通过用户名到数据库中获取凭证
    String password = getPasswordByUserName(userName);
    if (password == null) {
        return null;
    }
    SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(userName, password, "customRealm");
    // 加盐
    authenticationInfo.setCredentialsSalt(ByteSource.Util.bytes("a"));

    return authenticationInfo;
}
/**
 * 去数据库查询凭证
 * @param  userName
 * @return password
 */
private String getPasswordByUserName(String userName) {
    User user = UserDaoImpl.getUserByUserName(userName);
    return user.getPassword();
}

(2) 授权流程

  (获得用户名 ,根据用户名 获得用户和权限的集合   给info对象  返回之后  即可判断用户输入的信息和所返回的信息的一致          性:代码如下)

/**
 * 授权
 * @param principalCollection
 * @return
 */
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    String userName = (String) principalCollection.getPrimaryPrincipal();
    // 从数据库或者缓存中获取角色数据
    Set<String> roles = getRolesByUserName(userName);
    // 从数据库或者缓存中获取权限数据
    Set<String> permission = getPermissionByUserName(userName);

    //摄入daoinfo中 和用户数据比较
    SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
    simpleAuthorizationInfo.setRoles(roles);
    simpleAuthorizationInfo.setStringPermissions(permission);
    return simpleAuthorizationInfo;
}

/**
 * 数据库或者缓存中获取角色数据
 * @param userName
 * @return
 */
private Set<String> getRolesByUserName(String userName) {
    List<String> roleList = userDao.queryRolesByUserName(userName);
    Set<String> roleSets = new HashSet<String>(roleList);
    return roleSets;
}

/**
 * 数据库或者缓存中获取权限数据
 * @param userName
 * @return
 */
private Set<String> getPermissionByUserName(String userName) {
    List<String> permissionList = userDao.queryPermissionByUserName(userName);
    Set<String> permissionsSets = new HashSet<String>(permissionList);
    return permissionsSets;
}

Controller代码如下:

if(subject.hasRole("admin"))
    return "admin权限";
else
    return "没有admin权限";

2.通过注解方式进行授权

(1)依赖

<!--shiro 配置注解授权使用-->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.10</version>
</dependency>

(2)mvc.xml中三个配置

<!--shiro 注解驱动的三个步骤-->
<!--开启aop-->
<aop:config proxy-target-class="true"/>

<bean class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    <property name="securityManager" ref="securityManager"/>
</bean>


测试

@RequiresRoles("admin")
@RequestMapping("/testRole")
@ResponseBody
public String testRole()
{
    return "test Success";
}

@RequiresRoles("admin1")
@RequestMapping("/testRole1")
@ResponseBody
public String testRole1()
{
    return "test Success";
}

                                                                                                                     2018-6-7      14:06





猜你喜欢

转载自blog.csdn.net/weixin_41253479/article/details/80598031