Skip to main content

Spring5 + Rest + Agile (3)

The basic framework is created already.
1. JWT Auth
2. Hello Rest API.

now, it will be good time to switch to database based user authorization.
we use customized userDetailService instead of default in memeory user services.

Replace InMemeory UserDetailService as DaoUserDetallService

@Autowiredprivate UserDetailsService userDetailService;
@Autowiredpublic void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailService); }

and create new class of it:
@Primary@Servicepublic class DaoUserDetailServices implements UserDetailsService
{
    @Autowired    private PasswordEncoder bCryptPasswordEncoder;
    @Override    public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException {
        if(name.equals("admin")) {
            return new UserPrincipal(name, bCryptPasswordEncoder.encode("password"), "ADMIN");
        }
        else if(name.equals("user")) {
            return new UserPrincipal(name, bCryptPasswordEncoder.encode("password"), "USER");
        }
        else            return null;    }

    @Bean    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();    }

}


public class UserPrincipal implements UserDetails {
    private final String name;    private final String password;    private final String admin;
    public UserPrincipal(String name, String password, String admin) {

        this.name = name;        this.password = password;        this.admin = admin;    }

    @Override    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;    }

    @Override    public String getPassword() {
        return this.password;    }

    @Override    public String getUsername() {
        return this.name;    }

    @Override    public boolean isAccountNonExpired() {
        return true;    }

    @Override    public boolean isAccountNonLocked() {
        return true;    }

    @Override    public boolean isCredentialsNonExpired() {
        return true;    }

    @Override    public boolean isEnabled() {
        return true;    }
}

we don't touch any hibernate yet, all we did is just hardcode the in memeory logic to here and have all test cases passed(very important, one small successful step will help build big scope more efficiently instead of having all-in-one and then debug in mess.)

Hook up with database.
POM.xml
<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-jpa</artifactId></dependency>
<dependency>    <groupId>org.postgresql</groupId>    <artifactId>postgresql</artifactId>    <scope>runtime</scope></dependency>

There is hibernate bug with postgresql due the critical key word "user" in database
Wrong:
@Entity@Tablepublic class User {
    @Id    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(nullable = false, unique = true)
    private String name;
    @Column(nullable = false, columnDefinition="default ''")
    private String password;
    ...

}

Correct:
@Entity@Table(name = "users")
public class User {
    @Id    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(nullable = false)
    private String name;
    @Column    private String password;
    ...
}

UserRepository
public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByName(String name);}


DaoUserDetailServices
@Primary@Servicepublic class DaoUserDetailServices implements UserDetailsService
{
    @Autowired    private UserRepository userRepository;
    @Override    public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException {
        var user = userRepository.findByName(name).stream().findFirst().orElse(null);        if(user == null) {
            return null;        }
        return new UserPrincipal(user.getName(), user.getPassword(), user.getRole());    }
}



Setup different database for unit test.

copy main application.properties and data.sql to test folder, and change the database name as demo
spring.datasource.url=jdbc:postgresql://localhost:5432/demo
 spring.datasource.username=postgres
spring.datasource.password=postgres
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
spring.datasource.initialization-mode=always















































































Comments

Popular posts from this blog

How to fix "ValueError when trying to compile python module with VC Express"

When I tried to compile the python, I always get compile issue as following: ------------ ... File "C:\Python26\lib\ distutils\msvc9compiler.py ", line 358, in initialize vc_env = query_vcvarsall(VERSION, plat_spec) File "C:\Python26\lib\ distutils\msvc9compiler.py ", line 274, in query_vcvarsall raise ValueError(str(list(result.keys()))) ValueError: [u'path'] --------------------- Python community discussed a lot but no solution: http://bugs.python.org/issue7511 The root cause is because the latest visual studio change the *.bat file a lot especially on 64bit env. The python 2.7 didn't update the path accordingly. Based on the assumption above, the following solution worked for me. To install Visual Studio 2008 Express Edition with all required components: 1. Install Microsoft Visual Studio 2008 Express Edition. The main Visual Studio 2008 Express installer is available from (the C++ installer name is vcsetup.exe): https://ww

How to convert the ResultSet to Stream

Java 8 provided the Stream family and easy operation of it. The way of pipeline usage made the code clear and smart. However, ResultSet is still go with very legacy way to process. Per actual ResultSet usage, it is really helpful if converted as Stream. Here is the simple usage of above: StreamUtils.uncheckedConsumer is required to convert the the SQLException to runtimeException to make the Lamda clear.

How to run odoo(openerp8) in IDE from source on windows

1. install python 2.7 (per openerp8's official doc, python 27 is required.) 2. download get-pip.py from https://bootstrap.pypa.io/get-pip.py , execute the command: python get-pip.py 3. get source of openerp8 from https://github.com/odoo/odoo.git 4. execute the command: pip install -r D:\source_code\odoo\openerp8/requirements.txt . (requirements.txt contains all dependencies. ) The pip will install the python module automatically. However, the real world always bring us the issues because our C++ compile environment is not setup correctly.  we will get the link error when pip try to install psycopg2 (driver to access postgresql db.). Go to  http://www.stickpeople.com/projects/python/win-psycopg/  and choose the compiled binary file directly. For Python-ldap, go to  http://www.lfd.uci.edu/~gohlke/pythonlibs/ 5. Finally, go to http://sourceforge.net/projects/pywin32/files/pywin32 and choose correct version for python-win32service. 6. If you are family with eclipse a lot,