spring-shiro 的配置以及使用(纯xml实现)

spring-shiro

这篇文章主要用来记录一下在回顾shiro使用纯xml配置文件开发的一些心得和我使用的相关代码和逻辑。

1.导入依赖

    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-core</artifactId>
      <version>1.3.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-web</artifactId>
      <version>1.3.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-spring</artifactId>
      <version>1.3.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-ehcache</artifactId>
      <version>1.3.2</version>
    </dependency>

2.写mapper以及service

  • 这里就是获取数据库中数据,进行传入service层待用
    在mapper层中有一个通过姓名查询用户的方法。

  • service层

    • 这里进行业务处理
    @Service
    public class UserServiceImpl implements UserService {
        @Override
        public Map<String, Object> selectUserByUsername(String username, String password) {
            HashMap<String, Object> result = new HashMap<>();
            //subject相当于一个实例对象,里面有许多属性
            Subject subject = SecurityUtils.getSubject();
            if(!subject.isAuthenticated()){
                //将username和password存入到token中,方便后面使用
                UsernamePasswordToken token =new UsernamePasswordToken(username,password);
                try {
                    subject.login(token);  //认证行为,会进入后面的认证类
                }catch (UnknownAccountException e){
                    //用户不存在
                    result.put("code", -1);
                    result.put("message", username+"不存在");
                    return result;
                }catch (IncorrectCredentialsException e){
                    //用户名和密码不匹配
                    result.put("code", -2);
                    result.put("message", username+"密码错误");
                    return result;
                }catch (AuthenticationException e){
                    e.printStackTrace();
                    result.put("code", -3);
                    result.put("message", "认证失败");
                    return result;
                }
            }
            //已经登陆过要做的事情
            System.out.println(username+"认证通过了");
            //从shiro提供的session对象中获取已经认证的用户信息
            Object user = subject.getSession().getAttribute("user");
            result.put("code", 200);
            result.put("message", "认证成功");
            result.put("loginUser", user);
            return result;
        }
    }
    

3.写认证类

3.1这个认证类需要继承AuthorizingRealm类,并实现下面的两个方法

3.2详细实现

public class AuthRealm extends AuthorizingRealm {
    @Resource
    UserMapper userMapper;
//    授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        //获取令牌中的username
        String username= (String) principalCollection.getPrimaryPrincipal();
        User user = userMapper.selectUserByName(username);
        HashSet<String> set = new HashSet<>();
        if (user!=null){
            //这里可能不止一个权限,这个时候需要将数据库中权限存在一个list数组,然后将list数组转化为set
            set.add(user.getRole());
        }
        Set<String> perms = new HashSet<>();
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.setRoles(set);
        info.setStringPermissions(perms);
        return info;
    }
//    认证
//这里的认证经过盐值加密
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //获取token中传过来的username
        String username = (String) token.getPrincipal();
        User user = userMapper.selectUserByName(username);
        if (user==null)
            throw new UnknownAccountException(username+"不存在");
        Session session= SecurityUtils.getSubject().getSession();
        session.setAttribute("user",user);
        //获取username转换为byte当做盐进行加密
        ByteSource byteSource = ByteSource.Util.bytes(user.getUsername());
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), byteSource, getName());
        return info;
    }
}
3.2.2加密算法
public class MD5Utils {
    public static String MD5(String username,String password){
        return new SimpleHash("MD5", password, username,1024).toString();//迭代1024次,这个次数后面有用
    }
}
3.2.3pojo类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer id;
    private String username;
    private String password;
    private String role;
}

4.现在写完了开始配置spring-shiro.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 配置密码匹配器  散列的凭证匹配器 -->
    <bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
        <!-- 指定散列算法的细节  这里定义的算法和迭代次数需要和加密工具类定义的一致 上面的1024-->
        <property name="hashAlgorithmName" value="MD5"/>
        <property name="hashIterations" value="1024"/>
    </bean>

    <bean id="myAuthRealm" class="com.group.utils.AuthRealm">
        <property name="credentialsMatcher" ref="credentialsMatcher"/>
    </bean>

    <!--配置shiro的核心对象 安全管理器-->
    <bean id="securityManger" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <!--依赖注入我们自己定义realm bean-->
        <property name="realm" ref="myAuthRealm"/>
    </bean>

    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManger"/>
        <property name="loginUrl" value="/goLogin"/>
        <property name="unauthorizedUrl" value="/jsp/unauthorizedUrl.jsp"/>
        <!--敏感资源及用户身份定义-->
        <property name="filterChainDefinitions">
            <value>
                /goLogin = anon  <!--匿名用户才能访问-->
                /login = anon
                /logout = authc <!--已通过认证的用户可以访问-->
                /goIndex = authc  <!--普通用户管理员都能访问-->
                /goMain = roles[管理员] <!--管理员才能访问-->
                /static/** = anon
                /* = authc
            </value>
        </property>
    </bean>
</beans>

定义完成之后记得在pplicationContext.xml中引入!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值