TL; DR:我如何在Spring-Data-Rest为我们提供的扁平REST api方法中实现细粒度的访问控制?
所以 - 我正在使用Spring-Data-Rest创建一个API,其中有三个主要的访问级别:
1)管理员 - 可以查看/更新所有组
2)组的所有者 - 可以查看/更新组及其下的所有内容
3)子组的所有者 - 只能查看/更新他的组.没有递归嵌套,只允许一个子级别.
并且'group'作为资源公开(具有crud存储库).
到目前为止一直很好 - 我已经实现了一些使用Repository Event Handler进行修改的访问控制 - 所以在创建/写入/删除方面我觉得我很好.
现在我需要达到限制某些项目的可见性的程度.这对于获得单个项目是可以的,因为我可以使用Pre/Post Authorize注释并引用主体.
问题在于findAll()方法 - 我没有一个简单的钩子来过滤掉我不希望基于当前主体公开的特定实例.例如,子组所有者可以通过执行GET /组来查看所有组.理想情况下,他们应该拥有他们无法访问的项目甚至根本不可见.
对我来说,这听起来像是在存储库接口上编写自定义的@Query()注释,但这似乎并不可行,因为:
我需要在查询中引用主体.SPeL应该得到支持,但似乎根本没有使用?#表达式(尽管这篇博客文章提示不然:https : //spring.io/blog/2014/07/15/spel-support-in- spring-data-jpa-query-definitions).我通常使用带有1.1.8.RELEASE和Evans-RELEASE列的spring-boot来获取spring-data.
我需要编写的查询类型将根据访问级别而有所不同,访问级别实际上不能包含在单个JPQL语句中(如果管理员选择所有组,否则获取与主体用户关联的所有(子)组) ).
因此,我觉得我需要为此编写一些自定义存储库实现,并在代码中引用主体.嗯,这没关系 - 但是对于我需要控制访问权限的每个存储库来说,似乎需要做很多工作(我认为这几乎就是所有存储库).这适用于findAll和各种自定义搜索方法.
我接近这个错吗?是否有另一种方法可以根据当前登录的用户动态限制项目可见性,以便更好地工作?在像spring-data-rest暴露的平面命名空间中,我认为这将是一个常见的问题.
在先前的设计中,我刚刚通过暴露/ api/groups/{groupId}/...下的所有内容来解决它,并且让子资源定位器充当单个夹点以控制对其下任何内容的访问.在spring-data-rest中没有这样的运气.
更新:现在绊倒了一个覆盖findAll()的自定义方法(这适用于我的自定义接口上定义的其他方法).虽然这可能是一个单独的问题 - 我现在被阻止了.当我执行GET /组时,Spring-data并没有调用它,而是调用原始数据.奇怪的是,如果我在界面上定义一个并用@Query标记它,它确实使用我的查询(可能不再支持内置方法的自定义覆盖?).
public interface GroupRepository extends JpaRepository<Group, Long>, GroupCustomRepository {}
public interface GroupCustomRepository {
Page<Group> findAll(Pageable pageable);
}
public class GroupCustomRepositoryImpl extends SimpleJpaRepository<Group, Long> implements GroupCustomRepository {
@Inject
public GroupCustomRepositoryImpl(EntityManager em) {
super(Group.class, em); …Run Code Online (Sandbox Code Playgroud) rest spring spring-security spring-data-jpa spring-data-rest
我每隔5分钟监视一次SQL数据库的连接.几天它会徘徊在5个连接(我的闲置)然后突然我在50岁.显然这是一个递归问题,因为我不明白为什么我会在5分钟内从零跳到5到50.
我正在使用Hibernate 4和Tomcat,我知道在4.3.2中修补的Hibernate中的一个问题,但我在4.3.5
更多细节: 池空事件每天都在7:13:20发生...听起来太自动了.我正在使用Quartz,它每1分钟运行一次,但我看不出它们是如何相关的.
我的房产:
jmxEnabled = true
initialSize = 5
maxActive = 50
minIdle = 5
maxIdle = 25
maxWait = 10000
maxAge = 10 * 60000
timeBetweenEvictionRunsMillis = 5000
minEvictableIdleTimeMillis = 60000
validationQuery = "SELECT 1"
validationQueryTimeout = 3
validationInterval = 15000
testOnBorrow = true
testWhileIdle = true
testOnReturn = false
jdbcInterceptors = "ConnectionState"
defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED
Run Code Online (Sandbox Code Playgroud)
环境:
更多信息: 我将石英作业频率降低到每5分钟一次.当我在应用程序中加载页面/视图时,事件仍然发生.这大致是在晚上7:14.我即将降级为冬眠3.
今天更新我在下午6:50在Tomcat管理器中重新加载了应用程序,但事件仍然发生. 线程转储
tomcat hibernate transactions connection-pooling sql-server-2012
iOS上的webapp基本上是一个无头浏览器.
Android上有类似的东西吗?
据我了解,你只能在主屏幕上放置书签.那是对的吗?
注意:不是选项包装到原生的东西.
我正在使用适用于 Go 的 docker 客户端 SDK,但在将图像推送到我的 AWS ECR 时遇到了问题。
这是我的功能的要点
import (
"github.com/docker/docker/api/types"
dockerclient "github.com/docker/docker/client"
)
func doPush(target string) {
envCli, err := dockerclient.NewEnvClient()
if err != nil {
panic(err)
}
rc, err := envCli.ImagePush(
context.Background(),
target,
types.ImagePushOptions{})
if err != nil {
panic(err)
}
defer rc.Close()
}
Run Code Online (Sandbox Code Playgroud)
我的图像被标记为 [regid].dkr.ecr.us-east-1.amazonaws.com/demo:latest 但我收到以下错误:
无效的参考格式
如果我从图像名称中删除 [:tag],它会一直工作,直到我得到一个
来自守护进程的错误响应:参数错误且缺少 X-Registry-Auth:EOF
当用户注册我的网站时,他们的Facebook个人资料图像会自动被拉出并用作他们的个人资料图片.图像很小,看起来像素化.有没有办法拉出更大版本的个人资料图片?使用Twitter注册的用户也会遇到同样的情况.
谢谢.
我有一个带有类属性和几个子类的主类.我想为每个子类设置默认类别.例如:
class BaseAd(models.Model):
CATEGORY_CHOICES = ((1, 'Zeta'), (2, 'Sigma'), (3, 'Omega'),)
category = models.IntegerField(choices=CATEGORY_CHOICES)
...
class SigmaAd(BaseAd):
additional_prop = models.URLField()
category = models.IntegerField(default=2, editable=False)
Run Code Online (Sandbox Code Playgroud)
当然,由于FieldError,我的示例不起作用.一个人如何"压倒"房产价值?或者它是我应该关注的管理员的功能?
我使用的是Grails的CKEditor插件,尽管可以将CKEditor的HTML内容存储到数据库中,但无法在视图中正确呈现它。
我在视图中得到的是HTML转义的内容,而不是标记内容。
<p> sdfsdfsadf</p> <p> asdfasdfasdf</p> <p> asdfasdfasdf</p> <p> ¥</p>
Run Code Online (Sandbox Code Playgroud)
当我想要的时候:
sdfsdfsadf
asdfasdfasdf
asdfasdfasdf
¥
Run Code Online (Sandbox Code Playgroud)
如何获取存储的数据以正确呈现?
我的构建服务中的两个测试失败,在本地运行时不会失败.
我发现当我在mvn clean test本地执行时,我的测试类的排序顺序是按字母顺序排列的(包和类),但是当在构建服务中运行时,它们看起来是随机的.
我不打算需要一个特定的"订单",所以我绝对担心一个测试先于另一个测试暗示了一个隔离问题.但是,我认为我不能告诉maven按特定顺序运行类.
我该怎么做才能重现?
编辑
我克隆了我的构建计划,但指着一个分叉的仓库(相同的代码),它成功运行,没有失败的测试...
我是Grails noob所以请原谅我的noob问题.
我已经创建了一个域类User和Device.用户有许多设备:设备和设备属于用户:用户.
重要的是,只有一个设备永远不会属于两个用户,因此我的UserController代码如下所示:
class UserController {
static allowedMethods = [create: 'POST']
def index() { }
def create() {
def user = User.findByUsername(request.JSON?.username)
def device = Device.findById(request.JSON?.deviceId)
if (device) {
device.user.devices.remove(device)
}
// device can only be owned by 1 person
def new_device = new Device(id: request.JSON?.deviceId, type: request.JSON?.deviceType)
if ( !user ) {
user = new User(
username: request.JSON?.username
)
user.devices = new HashSet() // without this I get null on the add in next line
user.devices.add(new_device)
user.save()
if(user.hasErrors()){ …Run Code Online (Sandbox Code Playgroud) grails grails-orm grails-controller grails-domain-class grails-2.0
我想同时提供选择和投票触发器。我已经尝试了很多次尝试,但都无济于事。
这是我的尝试之一:
properties(
[parameters([choice(choices: 'dev\nprod', description: 'environment to deploy', name: 'DEPLOY_TO')])],
[pipelineTriggers([pollSCM('H/2 * * * *')])]
)
Run Code Online (Sandbox Code Playgroud)