信息软件中一个非常重要的问题是具有不同职责和访问级别的不同角色的用户的存在.例如,想象一下具有如下结构(层次结构)的组织:
[Organization Role ] [Organization ID]
CEO org01
Financial Assistant org0101
personnel 1
Software Assistant org0102
personnel 2
Commercial Assistant org0103
personnel 3
Run Code Online (Sandbox Code Playgroud)
想象一下,该组织有一个管理人员信息的系统.在该系统中显示人员信息的规则是每个用户都可以看到他有权访问的组织的人员信息; 例如,'user1'可以访问'财务助理'和'商务助理'级别,因此他只能看到'人员1'和'人员3'的信息.同样,'user2'只能访问'Commercial Assistant'级别,因此他只能看到'人员3'的信息.因此,该系统中的每个用户都具有特定的访问级别.现在考虑在这个系统中,每个用户只能看到他登录后可以访问的人员信息.具有这个系统的表结构是这样的:
[Organization]
id
code
name
[Employee]
id
first_name
last_name
organization_id
[User]
id
user_name
password
[UserOrganization]
user_id
organization_id
Run Code Online (Sandbox Code Playgroud)
以下查询足以获得每个用户的正确人事信息结果:
select *
from employee e
where e.organization_id in
(select uo.organization_id
from user_organization uo
where uo.user_id=:authenticatedUserId)
Run Code Online (Sandbox Code Playgroud)
我们可以看到,以下条件定义了显示正确数据的访问逻辑:
e.organization_id in
(select uo.organization_id
from user_organization uo
where uo.user_id=:authenticatedUserId)
Run Code Online (Sandbox Code Playgroud)
这种访问级别也称为"行级安全性"(RLS).另一方面,相应的存储库类可能有几个负责读取数据的方法,所有这些方法都必须满足适当的访问级别条件.在这种情况下,访问级别条件将在某些地方(方法)重复.似乎使用'休眠过滤器'将是解决此问题的正确方法.唯一需要的是一个过滤器,它获取经过身份验证的用户的id,并在每个读取方法之前执行'enablefilter'命令.
@Filters( {
@Filter(name=“EmployeeAuthorize", condition="(organization_id in (select uo.organization_id from user_organization uo where …Run Code Online (Sandbox Code Playgroud) spring hibernate row-level-security spring-security spring-data
假设我有两个实体:组织和用户.每个用户都可以是许多组织的成员,每个组织都可以拥有许多用户.
@Entity
public class User {
@ManyToMany
Set<Organization> organizations;
//...
}
@Entity
public class Organization {
@ManyToMany(mappedBy="organizations")
Set<User> users;
//...
}
Run Code Online (Sandbox Code Playgroud)
现在,我想删除一个组织(假设它有1000个成员).当用户组织很少时,这段代码就可以了:
void removeOrgFromUser(Integer userId,Integer orgId){
User user = session.load(User.class, userId);
for (Organization org : user.organizations) {
if(org.getId().equals(orgId))
user.organizations.remove(org);
}
session.update(user);
}
Run Code Online (Sandbox Code Playgroud)
但是当组织数量为10,000时,此解决方案没有良好的性能.
我该如何解决?
我有一个依赖于项目 B 的 Spring Boot 项目 A。项目 B 有一些 .hbm.xml 资源。在更改休眠配置的项目 A 中,我添加 DatabaseConfiguration @Configuration 以更改 sessionFactory
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMappingLocations("classpath*:hibernate/**/*.hbm.xml");
Properties hibernateProperties = new Properties();
hibernateProperties.put("hibernate.dialect", HIBERNATE_DIALECT);
hibernateProperties.put("hibernate.show_sql", HIBERNATE_SHOW_SQL);
sessionFactoryBean.setHibernateProperties(hibernateProperties);
return sessionFactoryBean;
}
Run Code Online (Sandbox Code Playgroud)
build.gradle 有这个依赖 HibernateJpaAutoConfiguration 运行
compile 'org.springframework.boot:spring-boot-starter-data-jpa'
Run Code Online (Sandbox Code Playgroud)
当我在 gradle bootRun 或 maven spring-boot:run application start 中运行应用程序并确定但当我在 java -jar 中运行时我得到异常
caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'entityManagerFactory' defined in class path
resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]:
Invocation of init method failed; …Run Code Online (Sandbox Code Playgroud) 我有具有分组依据的 hql 查询。在分页结果中,我想获取要在分页中显示的所有结果的计数。在没有 group by 的查询中。我编写了一个实用程序,可以像这样从 hql 查询创建查询计数
select u
from Personel u
where u.lastname='azizkhani'
Run Code Online (Sandbox Code Playgroud)
我找到主要的“from”关键字和子字符串 hql 并添加 count(*) 然后进行此查询
select count(*)
from Personel u
where u.lastname='azizkhani'
Run Code Online (Sandbox Code Playgroud)
当我有包含 group by 的查询时,我不能这样做
select u.lastname,count(*)
from Personel u
group by u.lastname;
Run Code Online (Sandbox Code Playgroud)
sql 中该查询的计数是
select count(*)
from (
select u.lastname,count(*)
from tbl_personel u
group by u.lastname
)
Run Code Online (Sandbox Code Playgroud)
我如何通过 hql 查询生成组?
我有 GenericRepository 有这样的方法
public <U> PagingResult<U> getAllGrid(String hql,Map<String, Object> params,PagingRequest searchOption);
Run Code Online (Sandbox Code Playgroud)
开发人员这样称呼它
String hqlQuery = " select e from Personel e where 1<>2 …Run Code Online (Sandbox Code Playgroud) Aftre将我的应用程序从hibernate 4迁移到hibernate 5.my序列不起作用,而hibernate使用我们的默认序列而不是我的序列.my映射配置在hbm中这样我的数据库是oracle.
<id name="id" column="Id" type="java.lang.Long">
<generator class="sequence" >
<param name="sequence">SEQ_APP_Login_Log</param>
</generator>
</id>
Run Code Online (Sandbox Code Playgroud)
google之后有人说改变类到org.hibernate.id.enhanced.SequenceStyleGenerator但是不能再次使用了.
我想为我的组件创建测试.我有路由器解析器解析数据并在ng init中读取数据.我想为此创建测试.如何为此代码创建测试
@Component({
selector: 'jhi-label-detail',
templateUrl: './label-detail.component.html'
})
export class LabelDetailComponent implements OnInit {
label: Label;
constructor(
private route: ActivatedRoute
) {
}
ngOnInit() {
this.route.data.subscribe(({label}) => {
this.label = label.body ? label.body : label;
});
}
}
Run Code Online (Sandbox Code Playgroud)
和路线是这样的
{
path: 'label/:id/view',
component: LabelDetailComponent,
resolve: {
label: LabelResolve
}
}
Run Code Online (Sandbox Code Playgroud)
并解决这个问题
@Injectable()
export class LabelResolve implements Resolve<any> {
constructor(private service: LabelService) {
}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const id = route.params['id'] ? route.params['id'] : null;
if (id) {
return …Run Code Online (Sandbox Code Playgroud) 我的Controller中有一个返回对象列表的方法.此方法支持分页结果,并将HttpHeaders.LINK添加到HttpHeader以支持分页可发现性.我被迫添加这些行以获得支持.我想也许ControllerAdvice或ResponseAdvice支持这样做.我如何检查方法的返回?如果返回类型是QueryResult然后添加HttpHeader?
@RequestMapping(value = "/list", method = RequestMethod.GET)
public ResponseEntity<QueryResult<Personel>> search(
SearchOption searchOption) {
QueryResult<Personel> list=ipersonelService.search();
HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(list, "/api/personel");
return new ResponseEntity<>(list, headers, HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)
此类通过Paging类生成Headers
public static HttpHeaders generatePaginationHttpHeaders(QueryResult page, String baseUrl)
throws URISyntaxException {
HttpHeaders headers = new HttpHeaders();
headers.add("X-Total-Count", "" + page.getTotalElements());
String link = "";
if ((page.getPageNumber() + 1) < page.getTotalPages()) {
link = "<" + generateUri(baseUrl, page.getPageNumber() + 1, page.getPageSize()) + ">; rel=\"next\",";
}
// prev link
if ((page.getPageNumber()) > 0) {
link += …Run Code Online (Sandbox Code Playgroud) 例如,我有重定向到 x.jsp 的下游服务,此位置不在网关路由中
gateway route --- localhost:8080/app - 192.168.1.1:80 (DownStream app)
Run Code Online (Sandbox Code Playgroud)
在 DownStream 应用程序中,当用户未登录时,它重定向到 192.168.1.1:80/Login.jsp,它位于Location响应的标头中。
此 URL 未使用网关。
我想编写一个 zuul 过滤器,通过在 zuul 动态路由中映射来更改此重定向 url,例如,对于在 zuul 过滤器更改Location标头中由网关路由的每个 url 。我怎样才能做到这一点?
spring-security spring-cloud netflix-zuul spring-cloud-netflix
我想为我的服务编写测试,我想确保参数发送正常.我可以测试它
import { Injectable } from '@angular/core';
import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { JhiPaginationUtil } from '.';
@Injectable()
export class JhiResolvePagingParams implements Resolve<any> {
constructor(private paginationUtil: JhiPaginationUtil) { }
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const page = route.queryParams['page'] ? route.queryParams['page'] : '1';
const defaultSort = route.data['defaultSort'] ? route.data['defaultSort'] : 'id,asc';
const sort = route.queryParams['sort'] ? route.queryParams['sort'] : defaultSort;
return {
page: this.paginationUtil.parsePage(page),
predicate: this.paginationUtil.parsePredicate(sort),
ascending: this.paginationUtil.parseAscending(sort)
};
}
}
Run Code Online (Sandbox Code Playgroud) 如何使用 mutableAclService 删除 spring security acl 中的用户访问权限。这段代码可以吗
private void deleteEntry(Long id){
ObjectIdentity objectIdentity = new ObjectIdentityImpl(OrganizationStructure.class, id);
Sid user = new PrincipalSid("admin");
Permission p1 = BasePermission.READ;
try {
MutableAcl acl = (MutableAcl) mutableAclService.readAclById(objectIdentity);
acl.getEntries().forEach(c->{
System.out.println(c.toString());
if(c.getSid().equals(user))
acl.getEntries().remove(c);
});
mutableAclService.updateAcl(acl);
} catch (NotFoundException nfe) {
}
}
Run Code Online (Sandbox Code Playgroud) hibernate ×5
spring ×3
angular ×2
java ×2
jpa ×2
orm ×2
spring-data ×2
hateoas ×1
hql ×1
jackson ×1
jql ×1
karma-runner ×1
many-to-many ×1
netflix-zuul ×1
phantomjs ×1
spring-boot ×1
spring-cloud ×1
spring-mvc ×1
sql ×1
testbed ×1
typescript ×1