小编Art*_*gon的帖子

如何使用Spring Boot和Spring Security保护REST API?

我知道保护REST API是一个广泛评论的主题,但我无法创建符合我的标准的小型原型(我需要确认这些标准是现实的).如何保护资源以及如何使用Spring安全性有很多选择,我需要澄清我的需求是否切合实际.

我的要求

  • 基于令牌的身份验证器 - 用户将提供其凭据并获得唯一且受时间限制的访问令牌.我想管理令牌创建,检查有效性,在我自己的实现中过期.
  • 一些REST资源将是公开的 - 根本不需要进行身份验证,
  • 只有具有管理员权限的用户才能访问某些资源,
  • 在授权所有用户后,可以访问其他资源.
  • 我不想使用基本身份验证
  • Java代码配置(不是XML)

当前状态

我的REST API运行良好,但现在我需要保护它.当我在寻找解决方案时,我创建了一个javax.servlet.Filter过滤器:

  @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;

        String accessToken = request.getHeader(AUTHORIZATION_TOKEN);
        Account account = accountDao.find(accessToken);

        if (account == null) {    
            throw new UnauthorizedException();    
        }

        chain.doFilter(req, res);

    }
Run Code Online (Sandbox Code Playgroud)

但是这个解决方案javax.servlet.filters不能正常工作,因为@ControllerAdviceSpring 存在异常处理问题servlet dispatcher.

我需要的

我想知道这些标准是否切合实际并获得任何帮助,如何开始使用Spring Security保护REST API.我阅读了许多教程(例如Spring Data REST + Spring Security),但都在非常基本的配置中工作 - 具有凭据的用户在配置 …

java rest spring spring-security

74
推荐指数
1
解决办法
8万
查看次数

如何在 React 组件之外调用 Zustand / React hook?

我有这个 Zustand 存储来存储有关登录用户的身份验证信息。

const authStore = (set: any) => ({
    ...initialState,
    doLogin: async (user: TLoggedInRequest) => {
        try {
            set(() => ({status: "pending"}))
            const result = await loginService.login(user)
            set(() => ({
                status: "resolved",
                user: result?.data.user,
                error: null
            }))
        } catch (error) {
            console.log("rejected error", error)
            set((state: any) => ({status: "rejected", error}))
        }
    },
    doLogout: async () => {
        await loginService.logout()
        set(() => initialState)
        history.push("/")
    }
});
Run Code Online (Sandbox Code Playgroud)

这是HTTPApiClient使用 Axios 与 REST API 进行通信的 GET 方法的示例(为了简洁,其余部分省略)。

async get<TResponse>(path: string): Promise<TResponse> …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs axios zustand

13
推荐指数
1
解决办法
2万
查看次数

数据访问对象(DAO)中的方法是应该抛出还是捕获它的异常?

我在数据访问对象中有一个Java方法.这个非常简单的方法将两个整数值插入数据库.

public void saveHourMin(int hour, int min) throws SQLException{
psInsert.setInt(1, hour);
psInsert.setInt(2, min);
psInsert.executeUpdate();
}
Run Code Online (Sandbox Code Playgroud)

这个方法,或者一般来说,任何DAO方法,抛出SQLException时是抛出异常,还是应该捕获并记录异常,然后通过返回代码通知用户?使用Spring的应用程序的正确方法是什么?

java architecture spring dao java-ee

10
推荐指数
2
解决办法
1万
查看次数

如何使用Thymeleaf处理TXT电子邮件模板?

我正在尝试plain text使用Thymeleaf从Spring应用程序发送电子邮件.

这是我的电子邮件服务:

@Override
public void sendPasswordToken(Token token) throws ServiceException {
    Assert.notNull(token);

    try {

        Locale locale = Locale.getDefault();

        final Context ctx = new Context(locale);
        ctx.setVariable("url", url(token));

        // Prepare message using a Spring helper
        final MimeMessage mimeMessage = mailSender.createMimeMessage();

        final MimeMessageHelper message = new MimeMessageHelper(
                mimeMessage, false, SpringMailConfig.EMAIL_TEMPLATE_ENCODING
        );

        message.setSubject("Token");
        message.setTo(token.getUser().getUsername());

        final String content = this.textTemplateEngine.process("text/token", ctx);
        message.setText(content, false);

        mailSender.send(mimeMessage);

    } catch (Exception e) {
        throw new ServiceException("Token has not been sent", e);
    }
}
Run Code Online (Sandbox Code Playgroud)

电子邮件被发送并发送到邮箱.

这是我的plain text …

email spring plaintext thymeleaf

8
推荐指数
1
解决办法
5757
查看次数

Spring 控制器中的 JSR-303 验证并获取 @JsonProperty 名称

JSR-303在我的 Spring 应用程序中进行验证,它可以根据需要工作。

这是一个例子:

@Column(nullable = false, name = "name")
    @JsonProperty("customer_name")
    @NotEmpty
    @Size(min = 3, max = 32)
    private String name;
Run Code Online (Sandbox Code Playgroud)

REST API 客户端customer_name用作输入字段的名称,发送到 API 芽验证字段错误org.springframework.validation.FieldError返回name作为字段的名称。

有什么方法可以获取JSON-ish在 中指定的名称@JsonProperty吗?或者我是否必须实现自己的映射器来将类字段名称映射到其 JSON 替代方案?

Edit1:将类字段重命名为与 JSON 名称对应的名称是不可替代的(出于多种原因)。

java mapping validation bean-validation

7
推荐指数
2
解决办法
1954
查看次数

一个方法上有多个 @Scheduled 注释

是否允许/在一个方法上有多个 @Scheduled 注释?

@Scheduled(cron = "0 5 0 * * *", zone = "Europe/Stockholm")
@Scheduled(fixedRate = 1000 * 60 * 20, initialDelay = 1000 * 60 * 5)
public void setSalariesAsArchived() {
//...
}
Run Code Online (Sandbox Code Playgroud)

java scheduled-tasks spring-boot

7
推荐指数
1
解决办法
2297
查看次数

图层和管道和过滤器之间的区别?

这两种设计模式有什么区别?它似乎与我非常相似,一个处理单元(层或过滤器)执行一些数据处理并将数据拉/推入另一个处理单元.单元n仅与单元通信n+1,n-1单元有定义一个特定单元提供的功能的接口.

有什么区别?

编辑:也许一个区别应该是数据流.在层流可以是top-down,bottom-up和/或通信between的一些层的内部.在管道和过滤器中,数据流从单元开始1并转到单元n(而不是返回).

design-patterns

6
推荐指数
1
解决办法
2404
查看次数

Java java.util.Calendar中区域设置的目的是什么?

我通过java.util.Calendar获取有关Java中特定日期的信息(例如一周,一个月,一年中的一天).在我的情况下,是否有某些理由为日历对象设置区域设置?我问是因为:

System.out.println(cal.get(Calendar.DAY_OF_WEEK));
Run Code Online (Sandbox Code Playgroud)

今天(星期日)的返回值始终为1,但在我们的区域设置(cs_CZ)中,它应为7.

Locale locale = new Locale("cs", "CZ");
TimeZone tz = TimeZone.getTimeZone("Europe/Prague");

Calendar cal = GregorianCalendar.getInstance(tz, locale);
cal.setTime(new Date());

// returns => 1 (but I expected 7)
System.out.println(cal.get(Calendar.DAY_OF_WEEK)); 
// returns => 3 - it's OK
System.out.println(cal.get(Calendar.DAY_OF_MONTH));
Run Code Online (Sandbox Code Playgroud)

编辑:我可以在周日使用1,但我必须确保这是不变的行为,无论使用Locale还是TimeZone.

java locale calendar date

4
推荐指数
1
解决办法
1万
查看次数

如何使用onClick处理程序在React组件中创建链接?

如何在没有onClick回调函数的情况下创建链接的正确/标准方法是什么URL

<a href="#" onClick={this.handleClick}>click me!</a>
Run Code Online (Sandbox Code Playgroud)

或者没有href,但是链接在视觉上是不可点击的:

<a onClick={this.handleClick}>click me!</a>
Run Code Online (Sandbox Code Playgroud)

所有教程,我看过了,工作与其他元素比<a>-点击<span>,<div>等等.但我想用<a>.

javascript components reactjs

4
推荐指数
2
解决办法
2万
查看次数

HTML中两种JS实现的区别

HTML文件中这两个JavaScript实现之间有什么区别?

  1. <script src="foo.js" type="text/javascript"></script>

  2. 正如Google Analytics以编程方式执行此操作:

      (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript';
    ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 
    'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(ga, s);
        })();
    
    Run Code Online (Sandbox Code Playgroud)

浏览器加载/呈现HTML页面的方式是否有任何差异,或者缓存此类JS脚本的连接是否存在一些差异?

html javascript

2
推荐指数
1
解决办法
114
查看次数