shiro+spring+_hibernate shiro加入注解后 service层service对象注入失败 报java.lang.NullPointerException [问题点


shiro加入注解后 service层service对象注入失败 报java.lang.NullPointerException [问题点

使用shiro进行权限控制 开启shiro框架注解支持

<property name="filterChainDefinitions">
            <value>
                /css/** = anon
                /js/** = anon
                /images/** = anon
                /validatecode.jsp* = anon
                /login.jsp = anon
                /userAction_login.action = anon
            <!-- perms过滤器检查当前登录用户是否具有取派员列表查询权限 -->
            <!-- 如果说当前登录用户具有这个权限 它就能够访问成功 没有这个权限会跳转到unauthorized.jsp -->
                /page_base_staff.action = perms["staff-list"]
                /page_base_region.action = perms["region-list"]
            <!-- 一切的请求都会经过这个过滤器处理 -->
            <!-- 这个过滤器用来检查你是否已经认证过了 就是说你是否已经登录过了 -->    
                /* = authc
            </value>
        </property>
    </bean>
    
    <!-- 注册安全管理器对象 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="bosRealm"/>
    </bean>
    
    <!-- 注册realm -->
    <bean id="bosRealm" class="com.itheima.bos.realm.BOSRealm">
    </bean>
    
    <!-- 开启shiro框架注解支持 -->
    <bean id="defaultAdvisorAutoProxyCreator"
        class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
            <!-- 必须使用cglib方式为Action对象创建代理对象 -->
        <property name="proxyTargetClass" value="true"/>
    </bean>
    
    <!-- 配置shiro框架提供的切面类,用于创建代理对象 -->
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager"></property>
    </bean>

realm简单授权机制

public class BOSRealm extends AuthorizingRealm{

    @Autowired
    private IUserDao userDao;
    @Autowired(required=true)
    private IStaffService staffService;
    
    public void setStaffService(IStaffService staffService) {
        this.staffService = staffService;
    }
    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.addStringPermission("staff-list");//硬编码了  看看当前登录用户是谁  他所实际对应的权限查出来
        //然后循环调用这个方法
        return info;
    }
    //认证  如果返回null说明认证失败了
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("自定义认证方法调用了...");
        //根据用户名查询数据库中的密码
        //认证逻辑是定死的不能更改
        UsernamePasswordToken passwordToken = (UsernamePasswordToken) token;
        String username = passwordToken.getUsername();
        User user = userDao.findUserByusername(username);
        //框架负责对比数据库中的密码和页面输入的密码是否一致
        if(user==null){
            //页面录入用户名不存在
            return null;
        }
        //第一个参数放USER 就是为了绑定该线程  最终放到session里面
        AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());
        return info;
    }
}

XXXaction 注入service时候 service为null

报错java.lang.NullPointerException
at cn.itheima.bos.web.action.StaffAction.pageQuery(StaffAction.java:46)
at cn.itheima.bos.web.action.StaffAction$$FastClassBySpringCGLIB$$6a8175fc.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)

快速解决方法

目标还没有深入了解shiro框架的运行机制

解决方式

spring配置文件

  <bean name="staffAction" class="cn.itheima.bos.web.action.StaffAction">
        <property name="staffService" ref="staffService"></property>
    </bean>  
  Service加入注解

@Service("staffService")
@Transactional
public class IStaffServiceImpl implements IStaffService {}

action文件

@Autowired(required=true)
    private IStaffService staffService;
    public IStaffService getStaffService() {
        return staffService;
    }

    public void setStaffService(IStaffService staffService) {
        this.staffService = staffService;
    }

即可


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM