java - Spring Security 单元测试@PreFilter 和@PostFilter 的正确方法
问题描述
什么是单元测试 Spring Security 注释@PostFilter
和@PreFilter
. 我在我的 DAO 类中使用这些注释,如下所示:
TodoDao.java
@Component
@Transactional
public class TodoDao implements ITodoDao {
@Autowired
private SessionFactory sessionFactory;
@Autowired
private AuthenticationFacade authenticationFacade;
@Override
@PostFilter("filterObject.userByUserId == @authenticationFacade.getAuthenticatedFacade()")
public List<Todo> getTodosByUserId(int userId) {
return sessionFactory.getCurrentSession().createQuery("from Todo where userId = ?").setParameter(0, userId).list();
}
}
这是我的 AuthenticationFacade 类:
AuthenticationFacade.java
@Component
public class AuthenticationFacade implements IAuthenticationFacade {
@Autowired
private IUserDao IUserDao;
public Authentication getAuthentication() {
return SecurityContextHolder.getContext().getAuthentication();
}
public User getAuthenticatedFacade() {
Authentication authentication = getAuthentication();
User user = IUserDao.findByUsername(authentication.getName());
return user;
}
}
这是我的 DAO 单元测试类,我使用 H2 内存数据库:
TodoDaoTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration (value = "classpath:/conf/applicationContext-test.xml")
@Transactional
public class TodoDaoTest {
@Autowired
SessionFactory testSessionFactory;
@InjectMocks
TodoDao todoDao;
private boolean mockInitialized = false;
@Before
public void setUp(){
if(!mockInitialized) {
MockitoAnnotations.initMocks(this);
mockInitialized = true;
}
todoDao.setSessionFactory(testSessionFactory);
}
@Test
@WithMockUser (username = "user", roles = "ROLE_USER")
//I want to test here if @WithMokUser is different from userId
//Than the list sould return empty always.
public void getTodosByUserIdShouldReturnEmptyListIfCurrentUserIsDifferentFromSearchedUser(){
int userId = 3;
assertTrue(todoDao.getTodosByUserId(userId).isEmpty());
}
}
解决方案
推荐阅读
- haskell - Haskell 递归函数返回一个布尔值
- html - 如何从背景大小覆盖到 105% 105% 的 CSS 过渡?
- reactjs - React:使用 React.createElement 时的 appendChild 替代方案
- javascript - 如何在以下代码段中从另一个类导入的自定义 JSX 标记中换行:
- xaml - 如何在 App.xaml 静态资源中使用嵌套字符串...?
- html - 新的基于 Chromium 的 Edge 的垂直高度是否比 Chrome 短?标题一半在 Edge 中消失了,但 Chrome 可以吗?
- java - MyClass 类型的 getMethod() 的类型是 String,这与描述符的返回类型不兼容:U
- php - php7.3 或 apache2.4 是否可以记录每个文件更改/创建,以便轻松发现网站漏洞?
- java - Spring JPA-我得到错误,即使我已经坚持了对象也没有坚持
- android - 如何在 Room DB 中处理多个数据库版本