当前位置: 首页 > 知识库问答 >
问题:

Grails Spring Security性

傅茂实
2023-03-14

我正在尝试创建一个登录页面,它将根据用户的角色登录到特定的帐户,但由于某些原因,spring security从未重新确认用户名和密码

这里是LoginController

package login_page

导入grails.plugin.SpringSecurity.UserDetails.DefaultPostAuthenticationChecks导入org.SpringFramework.Security.Access.Annotation.Securate

@Securite('permit all')类LoginController扩展了Grails.plugin.SpringSecurity.LoginController{

PersonService personService

def index() {
    if (isLoggedIn()) {
        redirect uri: conf.successHandler.defaultTargetUrl
    }
    else {
        redirect action: 'auth', params: params
    }
}
def auth() {

    def conf = getConf()

    if (isLoggedIn()) {
        redirect uri: conf.successHandler.defaultTargetUrl
        return
    }

    String postUrl = request.contextPath + conf.apf.filterProcessesUrl
    render view: 'index', model: [postUrl: postUrl,
                                 rememberMeParameter: conf.rememberMe.parameter,
                                 usernameParameter: conf.apf.usernameParameter,
                                 passwordParameter: conf.apf.passwordParameter,
                                ]
}

}

LoginPage方法如下

   @Secured(['ROLE_USER','ROLE_ADMIN','ROLE_SUPERADMIN'])
def LoginPage() {
      refreshCurrentUser()
    if (currentPerson == null) {
        notFound()
    }else {
        if(currentPerson.getAuthorities()[0].getAuthority()=="ROLE_SUPERADMIN"){
            redirect(controller:'superAdmin', action: 'superAdminShow', id: currentPerson.id)
        }
       else if(currentPerson.getAuthorities()[0].getAuthority()=="ROLE_ADMIN"){
            redirect(controller:'admin', action: 'adminShow', id: currentPerson.id)
        }
        else if(currentPerson.getAuthorities()[0].getAuthority()=="ROLE_USER"){
            redirect(action: 'show', id: currentPerson.id)
        }
    }
}

共有1个答案

羊丰茂
2023-03-14

这是一个非常简单的安全配置,我为一个愚蠢的演示临时拼凑起来(一个反应性Java Rest API)。我绝不是一个安全专家,但它可以让你对所涉及的事情有一个想法。

import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;

import XXXXXXXX.Permissions;
import XXXXXXXXX.UserPermissions;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.authentication.ReactiveAuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.authorization.AuthorizationDecision;
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.config.web.server.ServerHttpSecurity.AuthorizeExchangeSpec;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.server.SecurityWebFilterChain;
import org.springframework.security.web.server.authorization.AuthorizationContext;
import reactor.core.publisher.Mono;


@Configuration
@EnableWebFluxSecurity
public class ApiSecurityConfiguration implements ReactiveAuthenticationManager{

    @Autowired
    Permissions permissions;
    @Autowired
    RedisTemplate<String, Object> redisCache;

    private static final Logger logger = LoggerFactory.getLogger(ApiSecurityConfiguration.class);
    private UserPermissions userPermissionTable;

    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        AuthorizeExchangeSpec authorize;
        http.formLogin().disable();
        http.csrf().disable();
        http.logout().disable();å
        http.httpBasic().disable();
        http.httpBasic().
        authenticationManager(this::authenticate);
        authorize = http.authorizeExchange();
        authorize.anyExchange().access(this::check);

        return http.build();
    }

    private Mono<AuthorizationDecision> check(Mono<Authentication> authentication, AuthorizationContext context) {
        return authentication.map(a ->this.checkAuthorizations(a, context)).map(granted -> new AuthorizationDecision(granted));
    }

    private boolean checkAuthorizations(Authentication a, AuthorizationContext context){
        boolean ret = false;
        String name = a.getName();
        if (a.isAuthenticated()){
            logger.info(String.format("FOUND %s, authorizing...", name));
            ret = userPermissionTable.canAccess("XXXX", context.getExchange().getRequest().getPath().value(), context.getExchange().getRequest().getMethodValue());
            logger.info(String.format("%s access granted: %B", name, ret));
        }
        return ret;
    }

    @Override
    public Mono<Authentication> authenticate(Authentication authentication) {
        CompletableFuture<UserPermissions> cup;
        Authentication auth;
        String name = null;

        auth = authentication;
        auth.setAuthenticated(false);
        try {
            name = authentication.getName();
            logger.info(String.format("Looking %s in cache...", name));
            userPermissionTable = (UserPermissions)redisCache.opsForValue().get(name);
            if (userPermissionTable == null){
                logger.info(String.format("NOT in cache, authenticating: %s ...", name));
                cup = permissions.getPermissionsForUser(name, authentication.getCredentials().toString());
                userPermissionTable = cup.get(1000, TimeUnit.MILLISECONDS);
                redisCache.opsForValue().set(name, userPermissionTable, userPermissionTable.getTTL(), TimeUnit.MINUTES);
                auth = new UsernamePasswordAuthenticationToken(authentication.getPrincipal(), authentication.getCredentials(), null);
                logger.info(String.format("Authenticated: %s", name));
            }
            else{
                auth = new UsernamePasswordAuthenticationToken(authentication.getPrincipal(), authentication.getCredentials(), null);
                redisCache.expire(name, userPermissionTable.getTTL(), TimeUnit.MINUTES);
            }
        } catch (Exception e) {
            logger.info(String.format("FAILED to authenticate: %s", name));
        }
        return Mono.just(auth);
    }
}
 类似资料:
  • 本文向大家介绍针对用户观看短视频场景,请你分析不同年龄段女性的正向需求,可以基于内容,心理,动机和行为进行分析相关面试题,主要包含被问及针对用户观看短视频场景,请你分析不同年龄段女性的正向需求,可以基于内容,心理,动机和行为进行分析时的应答技巧和注意事项,需要的朋友参考一下 首先,定义观看短视频的女性人群,应该主要在15-60岁之间。可将女性划分为15-30岁青年女性;30-45岁中年女性;45-

  • 本文向大家介绍jQuery的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?相关面试题,主要包含被问及jQuery的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?时的应答技巧和注意事项,需要的朋友参考一下 [jQuery] jQuery的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?

  • 本文向大家介绍针对jQuery性能的优化方法有哪些?相关面试题,主要包含被问及针对jQuery性能的优化方法有哪些?时的应答技巧和注意事项,需要的朋友参考一下 show slide animate 等频繁修改 dom 很耗性能,可采用 jquery.transit 插件等 使用单个 id 或 class 选择器当然也是优化点咯,元素选择器是真的会卡 每次调用 $() 其实都是生成一个超大的对象,还

  • 问题内容: 我有使用WITH子句几个查询或公用表表达式,用UNION ALL语句来描述与SQL服务器的树形结构通过表再次出现在这里。如果我创建相同的VIEW而不是将它包含在WITH子句中,并在每次运行查询时生成它,我会在性能上有所不同吗?因为在多个查询中使用视图,所以实际上创建视图通常被认为是一种好的做法吗? 问题答案: 您正在查看的是Common Table Expression,而不是View

  • 问题内容: 我有一个主类,期望使用-D选项传递某些属性。我可以通过将其作为VM选项发送来在IDE中访问它。 我使用Maven并在尝试以下操作时将此应用程序打包到jar文件中: 要么 没有获取环境系统属性。 关于发生了什么的任何指示? 问题答案: 在。之前传递参数。如果在jar文件之后传递它们,它们将被解释为命令行参数并传递给in 。喜欢,

  • 问题内容: 自从我使用Java以来​​已经有5年了,那时,每当您想分配需要清理的对象(例如套接字,DB句柄)时,都必须记住添加一个块并在其中调用cleanup方法。那里。 相比之下,在C++(或确定对象生存期的其他语言,例如Perl)中,类实现程序将定义一个析构函数,该函数在该类的对象超出范围时执行清除。这种方法的优点是对象的用户不会忘记清理它- 即使抛出异常,析构函数也会被自动调用。这种方法用R

  • 问题内容: 我已经阅读了Java和C++之间的枚举差异问题?但是我还是很困惑。 我想以下返回相关的字符串: 据我所读,这应该是可能的。只是希望您对如何实现它有所了解。 问题答案: 简短答案 您需要一个构造函数,一个字段和一个吸气剂。 建设者 枚举类型可以具有构造函数,只要它们的访问级别为私有或默认(包私有)即可。除了枚举声明本身之外,您不能直接调用这些构造函数。与类相似,当定义不带参数的枚举常量时

  • 问题内容: 我的硬盘上有两个(每个2GB)文件,想要将它们相互比较: 使用Windows资源管理器复制原始文件大约需要花费时间。2-4分钟(即在同一物理和逻辑磁盘上进行读写)。 读取两次并逐字节比较字节数组需要20多分钟。 缓冲区为64kb,将文件分块读取然后进行比较。 比较完成是一个紧密的循环 我该怎么做才能加快速度?NIO是否应该比普通流更快?Java是否无法使用DMA / SATA技术,而是