访问不同端口中的 spring security,以字符串“anonymousUser”形式获取主要数据

2024-01-07

我有一个应用程序在我的本地 8100 中运行,我的服务器端代码在它已实现的 8065 中执行Spring Security作为 Java 配置。当我从 8100 ionic 浏览器窗口输入登录服务器代码时。我得到的原则对象数据只有字符串作为anonymousUser。 我打印了我的服务器端代码Authentication and Principle数据。下面贴上代码。

For Authentication

Authentication auth = SecurityContextHolder.getContext().getAuthentication()

auth数据是,

org.springframework.security.authentication.AnonymousAuthenticationToken@9055c2bc: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@b364: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: null; Granted Authorities: ROLE_ANONYMOUS

For getPrincipal

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

principal data

anonymousUser这个字符串只有它有。下面我粘贴了我的安全配置 java 类代码。

安全配置Java类

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    DataSource dataSource;

    @Autowired
    private SecurityUserService userDetailsService;

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/user/createsocialuser");
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
    }


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        ExceptionMappingAuthenticationFailureHandler loginFailureHandler = new ExceptionMappingAuthenticationFailureHandler();

        loginFailureHandler.setDefaultFailureUrl("/login/loginFailure");

        http
        .authorizeRequests()
        .regexMatchers("/login.*").permitAll()
        .regexMatchers("/admin.*").hasRole("ADMIN")
        .regexMatchers("/user.*").hasRole("USER")
            .and()
            .formLogin()
            .usernameParameter("j_username") 
            .passwordParameter("j_password")
            .loginProcessingUrl("/j_spring_security_check")
            .defaultSuccessUrl("/login/loginSuccess")
            .permitAll()
            .failureHandler(loginFailureHandler)
            .permitAll().and().logout().permitAll()
            .and().exceptionHandling()
            .accessDeniedPage("/accessDenied/403").and().csrf().disable();
    }


}

登录网页

<form class="form-horizontal" name="loginform" data-ng-submit="doLogin(loginform,userDetails)">
          <label for="username">Username:</label>
          <input type="text" class="form-control" ng-model="$parent.login.email" id="j_username" placeholder="Enter username" name="j_username" >
          <label for="password">Password:</label>
          <input type="password" class="form-control" ng-model="$parent.login.password" id="j_password" placeholder="Enter password" type="password" name="j_password">
          <div class="alert alert-danger" id="loginerror" role="alert">
            invalid usermame or password
          </div><br/>

          <button type="submit" class="btn btn-default submit">Si in</button>
      </form>

Login Js

$scope.doLogin = function(loginform,userDetails) {
            if (loginform.$valid) {
             console.log('$parent.login.email',angular.toJson(self.login.email));
             console.log('$parent.login.password',angular.toJson(self.login.password));
             var loc = 'http://localhost:8080/Test_10030';
              $http.post(loc+'/j_spring_security_check?j_username='+self.login.email+'&j_password='+self.login.password)
             .success(function(data){ 
                   console.log('Server data =>',angular.toJson(data));
                 if(data.responseError == "loginFailed"){
                     alert("user name pasword incorrect")
                       console.error('Server data =>');
                     $log.log("Error login Credentials: ",JSON.stringify(data));
                     $location.url('login');
                 }


           if(data.responseSuccess == "success"){
              if(data.result != null){
                  var serverData = data.result;
                  console.warn('Server data =>',angular.toJson(serverData));
                  $rootScope.userData= serverData;
                  $location.url('/home');
              }
           }
           }).error(function(data){          
            //callback 
            console.log('Error Some Internal server Error',data);
           });
             } else {
              $log.log("form is invalid!");
              if (self.isNewUser) {
               loginform["username"].$dirty = true;
               loginform["usrtel"].$dirty = true;
              } 
              loginform["email"].$dirty = true;
              loginform["password"].$dirty = true;
             }
            };

登录控制器 Java

 @RestController
    @RequestMapping("/login")
    public class LoginController {
        @RequestMapping(value="/loginSuccess",method = RequestMethod.GET)
        public  ResponseWrapper  create(Principal principle) {  
            System.out.println("-------***************----------------"); 
            try {
                System.out.println("principle data=>"+principle)// NULL POINTER EXCEPTION
                System.out.println("-------sucess********----------------");
                ResponseWrapper wrap = new ResponseWrapper();

                Object principal = SecurityContextHolder.getContext().getAuthentication().getAuthorities();
                System.err.println("Principal dara=>"+principal);
                wrap.setResult(principle);
                wrap.setResponseSuccess("success");
                return wrap;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    }

用户详细信息类

@Service
@Transactional
public class SecurityUserService implements IUserService {

    @Autowired
    private SecurityUserDao gpuser_Dao;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        System.out.println("............" + username);
        GpUser user = gpuser_Dao.findUser(username);
        UserDetails userDetails = null;
        String rol = null;
        if (user == null) {
            throw new UsernameNotFoundException("No User found");
        } else {
            List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
            // Access DB and get the roles and assign
            Object obj = user.getAuthorities();
            System.out.println("obje data=>" + obj.toString());
            grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_ADMIN")); 
            userDetails = new User(user.getUsername(), user.getPassword(), true, true, true, true, grantedAuthorities);
            /** ADDING ROLES-Creating authentication object with roles **/
            Authentication authentication = new UserAuthenticationToken(user, userDetails,
                    userDetails.getAuthorities());
            // Set the authentication
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }
        Object principal = SecurityContextHolder.getContext().getAuthentication().getAuthorities();
        return userDetails;
    }
}

BootSecurityUserDao.java

@Repository
@Transactional
public class BootSecurityUserDao implements IUserDao {

    @PersistenceContext
    private EntityManager entityManager;

    @SuppressWarnings("unchecked")
    public GUser findUser(String username){
        try{

            String login = "select * from guser where username=:username";
            Query result = entityManager.createNativeQuery(login,GUser.class)
                    .setParameter("username", username);
            List<GUser> list  = result.getResultList();
            System.out.println("size of user list : " + list.size());
            if (list.size() > 0) {
                GUser user_from_db = list.get(0);
                return user_from_db;
            }

        }catch(DataAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
}

是否有任何其他代码为特定角色添加,例如anonymousUser or ROLE_ANONYMOUS在我的安全java配置类中。我添加了permitAll() for \login有关的URLS。或者 Spring Security 本身有任何代码可以解决这个问题,就像我有一个困惑一样。


可能是您的数据库角色分配不正确。做一件事,验证用户,然后自己分配角色,如下所示。

分配角色.java

public class AssignRoles implements UserDetailsService { 

    Public Principal principalObject;
    //getter setter

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { 
            List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
            //Access DB and get the roles and assign
            grantedAuthorities.add( new SimpleGrantedAuthority("Role_User"));

            boolean enabled = true;  
            boolean accountNonExpired = true;  
            boolean credentialsNonExpired = true;  
            boolean accountNonLocked = true;   
            UserDetails userDetails =  new User(userName,password,enabled,accountNonExpired, credentialsNonExpired,accountNonLocked,grantedAuthorities); 

           /**ADDING ROLES-Creating authentication object with roles**/
            Authentication authentication = new UserAuthenticationToken(principalObject, userDetails, userDetails.getAuthorities());
            //Set the authentication 
            SecurityContextHolder.getContext().setAuthentication(authentication);  //Authentication is assigned,Now check security context user will have roles
            return userDetails;
    }

}

UserAuthenticationToken.java

public class UserAuthenticationToken extends AbstractAuthenticationToken {

        private static final long serialVersionUID = 1L;
        private final Object principal;
        private Object credentials;

        /**Store the principal object(you can store any object like userbean anything) as principal,userdetails as credentials and authorities in Authentication object**/
        public UserAuthenticationToken(Object principal, Object credentials,
                Collection<? extends GrantedAuthority> authorities) {
            super(authorities);
            this.principal = principal;
            this.credentials = credentials;
            super.setAuthenticated(true);
        }

        public Object getCredentials() {
            return this.credentials;
        }

        public Object getPrincipal() {
            return this.principal;
        }

    }

登录控制器.java

public  ResponseWrapper create(Principal principle) {    
    try {
        ResponseWrapper wrap = new ResponseWrapper(); 

        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

         /**ADD THIS**/
        AssignRoles assignROles = new AssignRoles();
        assignRoles.setPrincipalObject(principal);
        assignRoles.loadUserByUsername(SecurityContextHolder.getContext().getAuthentication().getName())  //send username

        SecurityContextHolder.getContext().getAuthentication().getAuthorities() //It will print assigned roles

        return wrap;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

UPDATE:修改你的UserDetail.class to

@Service
@Transactional
public class BootUserService implements  IUserService {

    @Autowired
    private BootSecurityUserDao gpuser_Dao;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        System.out.println("............"+username);

        GUser gUser = gpuser_Dao.findUser(username);
  UserDetails userDetails = null;
        if (gUser== null) {
            throw new UsernameNotFoundException("No User found");
        } else {
            List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
            //Access DB and get the roles and assign
            grantedAuthorities.add( new       SimpleGrantedAuthority(gUser.getAuthority())); //If not fetched fetch from db and assign
            //you can add any number of roles like
            /** grantedAuthorities.add( new       SimpleGrantedAuthority("RoleJustAsString")); **/

            userDetails =  new  User(userName,password,enabled,accountNonExpired, credentialsNonExpired,accountNonLocked,grantedAuthorities); 

           /**ADDING ROLES-Creating authentication object with roles**/
            Authentication authentication = new UserAuthenticationToken(gUser, userDetails, userDetails.getAuthorities());
            //Set the authentication 
                   SecurityContextHolder.getContext().setAuthentication(authentication); 
        }
        System.out.println("-=--------------user----"+user.toString());
        return userDetails;

    }
}

Remove AssignRoles.java并保留UserAuthenticationToken class.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问不同端口中的 spring security,以字符串“anonymousUser”形式获取主要数据 的相关文章

  • 在 JTable 中移动行

    我使用 MVC 模式 并且有一个如下所示的 JTable List
  • 如何在 JFace 的 TableViewer 中创建复选框?

    我创建了一个包含两列的 tableViewer 我想将其中一列设为复选框 为此 我创建了一个 CheckBoxCellEditor 但我不知道为什么它不起作用 名为 tableName 的列显示其值正常 色谱柱规格如下 String COL
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • manifest.mf 文件的附加内容的约定?

    Java JAR 中的 MANIFEST MF 文件是否有任何超出 MANIFEST MF 约定的约定 JAR规范 http download oracle com javase 1 4 2 docs guide jar jar html
  • CXF Swagger2功能添加安全定义

    我想使用 org apache cxf jaxrs swagger Swagger2Feature 将安全定义添加到我的其余服务中 但是我看不到任何相关方法或任何有关如何执行此操作的资源 下面是我想使用 swagger2feature 生成
  • Convert.FromBase64String 方法的 Java 等效项

    Java 中是否有相当于Convert FromBase64String http msdn microsoft com en us library system convert frombase64string aspx which 将指
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • 使用替换字符串中多个单词的最有效方法[重复]

    这个问题在这里已经有答案了 此刻我正在做 Example line replaceAll replaceAll cat dog replaceAll football rugby 我觉得那很丑 不确定有更好的方法吗 也许循环遍历哈希图 ED
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • Java中未绑定通配符泛型的用途和要点是什么?

    我不明白未绑定通配符泛型有什么用 具有上限的绑定通配符泛型 stuff for Object item stuff System out println item Since PrintStream println 可以处理所有引用类型 通
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • Android JNI C 简单追加函数

    我想制作一个简单的函数 返回两个字符串的值 基本上 java public native String getAppendedString String name c jstring Java com example hellojni He
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • java迭代器内部是如何工作的? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个员工列表 List
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的
  • 每个组织的 Spring Security 用户角色

    在我的应用程序中 我有一个名为组织的顶级实体 用户和组织之间的关系是多对多的 因此 我可能会遇到以下情况 用户拥有组织的角色 ROLE ADMIN 用户拥有组织的角色 ROLE USER 我需要确保当用户 A 访问 Organization

随机推荐

  • 将“增强记录”分配给普通“数据类型”变量时,应重载什么运算符?

    首先 我需要知道我想做的事情是否可行 如果可能的话 我需要知道如何做 演示问题比解释问题要容易得多 所以这里是 我有一个 增强记录 目的 虽然对这个问题并不重要 是生成一个 智能字符串 类型 以替换普通的字符串类型 TLKString re
  • 计算对象数组中属性的平均值

    假设有一个由两个或多个对象组成的数组 const arr PM1 10 PM10 20 PM1 20 PM10 30 CO 27 NO2 30 如何有效地计算组成数组的对象中每个属性的平均值 我事先不知道每个对象的属性 即使有共同的属性 我
  • Bash 中的正则表达式:不想包含目录

    我有一个图像列表 使用以下行收集 find mindepth 1 type f name JPG grep MG 0 9 0 9 0 9 0 9 JPG output DCIM 103canon IMG 0039 JPG DCIM 103c
  • R.styleable无法解析

    海朋友 我的java文件表明这个错误 R styleable 无法解析 我的 xml 文件
  • 在 PHP 中使用用户输入的变量设置文件名

    我只是想知道如何使用变量的名称在 PHP 中设置文件名 当我运行以下代码时
  • Xamarin.iOS 上的 SignalR - 随机无法调用 Hub 方法

    我有一个简单的Hub在 Azure 中运行 我可以通过 Windows 中的控制台应用程序完美地工作 我刚刚构建了一个简单的测试 Xamarin iOS 应用程序 它给出了一些奇怪的行为 随机在 LTE Wifi 或模拟器 设备上 调用集线
  • 在 Windows 上使用域用户使用 Ansible

    我开始学习 Ansible 但文档并没有太大帮助 我已经在 RHEL 上安装了控制机并创建了必要的hosts文件和窗口 yml 但是 当尝试连接到远程 Windows 服务器以取回 pong 时 我收到以下错误 root myd666 an
  • 如何保存Django ModelFormSet?

    我现在很绝望 我无法弄清楚这一点 对我来说 这应该很容易做到 但我还没有找到任何解释这一点的答案 两个模型之间没有外键 class Employee models Model surname models CharField max len
  • BufferedReader 的错误使用

    s new Scanner new BufferedReader new InputStreamReader this clientSocket getInputStream while s hasNext System out print
  • Symfony2 Doctrine 无法识别的字段:

    我创建了一个实体来存储我通过 api 提取的一些数据 当我尝试 findByOne 查看该条目是否已存在时 我收到一条错误消息 指出该字段无法识别 我已经完成了 php 应用程序 控制台学说 schema update force 我可以在
  • Java检查字符串是否回文的方法[重复]

    这个问题在这里已经有答案了 我想检查一个字符串是否是回文 我想学习一种简单的方法来使用最少可能的字符串操作来检查相同的内容 Using reverse是多余的 因为您不需要生成额外的字符串 您只需要查询现有的字符串 以下示例检查第一个和最后
  • 组合列表和字典理解

    我有某种冗长的逻辑 我想用一些理解来压缩 本质上 我有一个正在读取的 dict 对象 其中有 16 个我关心的值 我通过以下理解获得了我想要的密钥 I d i for i in range 16 源字典看起来像这样 I0 0 1 5 2 I
  • .NET MVC Fire and Forget Method 也立即返回 View

    我正在寻找 Fire Forget 方法的最佳解决方案 并立即返回 View 据我所知 我是否设置了 Action 的返回类型Task
  • 将文本文件加载到 RichTextBox 的最快方法是什么?

    我使用 OpenFIleDialog 将文本文件加载到 RichTextBox 中 但是 当大量文本 例如大约 50 70 行的歌曲文本 并且我单击 打开 时 程序会挂起几秒钟 3 5 秒 正常吗 也许有一些更快的方法或组件来加载文本文件
  • 如何在bootstrap中设置datetimepicker的MinDate和maxDate属性

    我想在引导程序中为 datetimepicker 动态设置 minDate 和 maxDate 属性 请帮我解决这个问题 在这种情况下 在一个日期时间选择器中选择日期时 应将该选定日期设置为其他日期时间选择器的 minDate 在第二个日期
  • 分离的 pthread 和内存泄漏

    有人可以向我解释一下为什么这个简单的代码会泄漏内存吗 我相信 由于 pthread 是在分离状态下创建的 因此它们的资源应该在终止后立即释放 但事实并非如此 我的环境是Qt5 2 include
  • Visual Studio 2017 错误无法打开“X”进行写入 - 对路径的访问被拒绝

    抱歉 我似乎无法修复此错误 严重性代码 说明 项目文件行抑制状态 错误 CS2012 无法打开 C Users Usuario source repos WindowsFormsApp1 WindowsFormsApp1 obj Debug
  • docker本地注册表“exec:\”htpasswd \“:在$ PATH中找不到可执行文件”

    直到最近这还工作得很好 docker run entrypoint htpasswd registry 2 Bbn myuser mypwd gt my registry2 reg hub auth htpasswd 现在它出错了 dock
  • 从结果集中创建长字符串

    我在存储过程中的 MS SQL 中有一个结果集 假设它有一个 VARCHAR 列 但有许多行 我想创建一个包含所有这些值的逗号分隔字符串 有没有一种简单的方法可以做到这一点 或者我是否必须逐步遍历每个结果并手动构建字符串 最好我想在存储过程
  • 访问不同端口中的 spring security,以字符串“anonymousUser”形式获取主要数据

    我有一个应用程序在我的本地 8100 中运行 我的服务器端代码在它已实现的 8065 中执行Spring Security作为 Java 配置 当我从 8100 ionic 浏览器窗口输入登录服务器代码时 我得到的原则对象数据只有字符串作为