UNPKG

redux-security

Version:
351 lines (244 loc) 9.43 kB
# redux-security Redux security subsystem with user, group and access management [![NPM version][npm-image]][npm-url] [![Discord][discord-image]][discord-url] ![alt tag](https://raw.githubusercontent.com/lokhmakov/redux-security/master/docs/redux-security%20react%20scene%201.gif) ## INSTALL ### Stable `npm i -S redux-security` ### Development `npm i -S lokhmakov/redux-security` ## FEATURES * Service architecture ([redux-manager](https://github.com/lokhmakov/redux-manager) powered) * Journaling ([redux-journal](https://github.com/lokhmakov/redux-journal) powered) * Persist state ([PouchDB](https://github.com/pouchdb/pouchdb) powered) * Dynamic service configuration (state.config): * docsMax = 2 - maximum docs in state.docs * docsMaxOverRemove: true - remove old images over docsMax * User management * Session management * Auth * signup * login * logout * email confirmation * API * local * express * pouch * socket (SocketIO) ## EXAMPLES ### USERS: NODE-API ```js require('redux-journal').enable() const tags = 'redux-security.examples.users.node-api' import { write, error } from 'redux-journal' import { manager } from 'redux-manager' import { usersLocal } from 'redux-security' const api = usersLocal() manager.enableLogger(require('redux-node-logger')()) manager.getStore() api.create({ username: 'user1', password: 'password1' }).then(({ userID }) => { write(`USER _id = ${userID} CREATED`, `${tags}.api.create`) return api.update({ _id: userID, username: 'user2' }).then((result) => { write(`SUCCESS result = ${result}`, `${tags}.api.update`) return api.remove({ _id: userID }) }) }).then((result) => { write(`SUCCESS result = ${result}`, `${tags}.api.remove`) }).catch((e) => { error(e) }) ``` ### AUTH: NODE-API ```js require('redux-journal').enable() const tags = 'redux-security.examples.auth.node-api' import { write, error } from 'redux-journal' import { manager } from 'redux-manager' const serviceAuth = 'auth' const serviceSessions = 'sessions' const serviceUsers = 'users' import { sessionsLocal } from 'redux-security' const apiSessions = sessionsLocal({ serviceName: serviceSessions }) import { usersLocal } from 'redux-security' const apiUsers = usersLocal({ serviceName: serviceUsers }) import { authLocal } from 'redux-security' const apiAuth = authLocal({ serviceName: serviceAuth, serviceSessions, serviceUsers }) manager.enableLogger(require('redux-node-logger')()) manager.getStore() const username = 'root' const password = 'toor' apiUsers.create({ username, password }).then(() => { return apiAuth.login({ username, password}) }).then((result) => { write(`({ username = '${username}', password = '${password}'}) SUCCESS`, `${tags}.login`) }).catch((e) => { error(e) }) ``` ## AUTH: NODE-REDUX ```js require('redux-journal').enable() const tags = 'redux-security.examples.auth.node-redux' import { write, error } from 'redux-journal' import { manager } from 'redux-manager' const serviceAuth = 'auth' const serviceSessions = 'sessions' const serviceUsers = 'users' import { sessionsLocal } from 'redux-security' const apiSessions = sessionsLocal({ serviceName: serviceSessions }) import { usersLocal } from 'redux-security' const apiUsers = usersLocal({ serviceName: serviceUsers }) import { authLocal } from 'redux-security' import { authActions } from 'redux-security' const apiAuth = authLocal({ serviceName: serviceAuth, serviceSessions, serviceUsers }) manager.enableLogger(require('redux-node-logger')()) manager.getStore() const username = 'root' const password = 'toor' apiUsers.create({ username, password }).then(() => { manager.dispatch(authActions.login({ username, password }), serviceAuth) }).catch((e) => { error(e) }) ``` ## AUTH: NODE-SOCKET server.js ```js require('redux-journal').enable() const tags = 'redux-security.examples.auth.node-socket.server' import { write, error } from 'redux-journal' import { manager } from 'redux-manager' const serviceAuth = 'auth' const serviceSessions = 'sessions' const serviceUsers = 'users' import { sessionsLocal } from 'redux-security' sessionsLocal({ serviceName: serviceSessions }) import { usersLocal } from 'redux-security' const apiUsers = usersLocal({ serviceName: serviceUsers }) import { authLocal } from 'redux-security' import { authActions } from 'redux-security' authLocal({ serviceName: serviceAuth, serviceSessions, serviceUsers }) manager.enableLogger(require('redux-node-logger')()) manager.getStore() const username = 'root' const password = 'toor' apiUsers.create({ username, password }) import Express from 'express' import { Server } from 'http' import SocketIO from 'socket.io' const PORT = 3000 const app = new Express() const server = Server(app) const io = SocketIO(server) server.listen(PORT, (e) => { if (e) return error(e) write(`==> 🌎 0.0.0.0:${ PORT }`) }) import { authConfigAPISocketServer } from 'redux-security' authConfigAPISocketServer({ io }) ``` client.js ```js require('redux-journal').enable() const tags = 'redux-security.examples.auth.node-socket' import { write, error } from 'redux-journal' import { manager } from 'redux-manager' const serviceAuth = 'auth' const serverServiceName = 'auth' import { authSocket } from 'redux-security' import { authActions } from 'redux-security' const socket = require('socket.io-client')('http://localhost:3000') authSocket({ serviceName: serviceAuth, serverServiceName, socket }) manager.enableLogger(require('redux-node-logger')()) manager.getStore() const username = 'root' const password = 'toor' manager.dispatch(authActions.login({ username, password }), serviceAuth) ``` ## REACT server.js ```js require('redux-journal').enable() import { error, write } from 'redux-journal' import webpack from 'webpack' import webpackDevMiddleware from 'webpack-dev-middleware' import webpackHotMiddleware from 'webpack-hot-middleware' import webpackConfig from '../webpack.config' const PORT = 3000 const app = require('express')() const server = require('http').Server(app) const io = require('socket.io')(server) const compiler = webpack(webpackConfig) app.use(webpackDevMiddleware(compiler, { noInfo: false, publicPath: webpackConfig.output.publicPath })) app.use(webpackHotMiddleware(compiler)) app.use((req, res) => { res.sendFile(__dirname + '/static/index.html') }) server.listen(PORT, (e) => { if (e) return error(e) write(`==> 🌎 0.0.0.0:${ PORT }`) }) const tags = 'redux-security.examples.auth.react.server' import { manager } from 'redux-manager' const serviceAuth = 'auth' const serviceSessions = 'sessions' const serviceUsers = 'users' import { sessionsLocal } from 'redux-security' sessionsLocal({ serviceName: serviceSessions }) import { usersLocal } from 'redux-security' const apiUsers = usersLocal({ serviceName: serviceUsers }) import { authLocal } from 'redux-security' import { authActions } from 'redux-security' authLocal({ serviceName: serviceAuth, serviceSessions, serviceUsers }) manager.enableLogger(require('redux-node-logger')()) manager.getStore() const username = 'root' const password = 'toor' apiUsers.create({ username, password }) import { authConfigAPISocketServer } from 'redux-security' authConfigAPISocketServer({ io }) ``` client.js ```js require('redux-journal').enable() import injectTapEventPlugin from 'react-tap-event-plugin' injectTapEventPlugin() import { manager } from 'redux-manager' import { authSocket } from 'redux-security' const serviceAuth = 'auth' const socket = require('socket.io-client')('http://localhost:3000') authSocket({ serviceName: serviceAuth, socket }) manager.enableLogger(require('redux-logger')()) const store = manager.getStore() import React from 'react' import ReactDOM from 'react-dom' import { Provider } from 'react-redux' import { connect } from 'react-redux' import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider' import getMuiTheme from 'material-ui/styles/getMuiTheme' import AppBar from 'material-ui/AppBar' import { AuthAvatar } from 'redux-security' import { AuthFormTabs } from 'redux-security' const AuthAvatar1 = connect(state => ({ auth: state[serviceAuth] }))(AuthAvatar) const AuthFormTabs1 = connect(state => ({ auth: state[serviceAuth] }))(AuthFormTabs) const muiTheme = getMuiTheme({ palette: { accent1Color: require('material-ui/styles/colors').deepOrange500 }}) const render = () => ReactDOM.render( <Provider store={ store }> <MuiThemeProvider muiTheme={ muiTheme }> <div> <AppBar title='redux-security' iconElementLeft={ <div/> } iconElementRight={ <AuthAvatar1/> } /> <AuthFormTabs1/> </div> </MuiThemeProvider> </Provider>, document.getElementById('app') ) render() ``` [npm-url]: https://npmjs.org/package/redux-security [npm-image]: https://img.shields.io/npm/v/redux-security.svg?style=flat [discord-url]: https://discord.gg/CSJq3CU [discord-image]: https://discordapp.com/api/servers/203409883263926272/widget.png?style=button